go /* CTE 存储过程分页 */ ALTER PROCEDURE [dbo].[T_StocPage] ( @RecordCount int = 0 output, --记录总数[返回] @PageCount int =0 output, @PageSize int = 10, -- 页尺寸 @PageIndex int = 1, -- 页码 @TableName nvarchar(255), -- 表名 @IdentityColumnName nvarchar(255), -- 主键字段名 @FieldsList nvarchar(2000), --列名 @FieldSearchKey nvarchar(2000) = '', -- 查询条件 (注意: 不要加 where) @OrderString nvarchar(1000) -- 排序 ) AS --declare @timediff datetime --耗时 --select @timediff=Getdate() --set nocount on declare @strSQL varchar(4000) -- 主语句 declare @strTmp nvarchar(2000) -- 临时变量 declare @PageLowerBound int --当前页面第一条记录的位置序数 declare @PageUpperBound int --当前页面最后一条记录位置序数 --SET @PageCount = 0 ------------------------排序条件-------------------------- if @OrderString IS NOT NULL AND @OrderString != ''--是否存在查询条件 SET @OrderString = 'ORDER BY '+@OrderString ELSE SET @OrderString = '' ------------------------查询条件-------------------------- if @FieldSearchKey IS NOT NULL AND @FieldSearchKey != ''--是否存在查询条件 SET @strTmp = 'SELECT @RecordCount=COUNT(' + @IdentityColumnName + ') FROM [' + @TableName + ']'+' WHERE ' + @FieldSearchKey ELSE SET @strTmp = 'SELECT @RecordCount=COUNT(' + @IdentityColumnName + ') FROM [' + @TableName + ']' EXECUTE sp_executesql @strTmp,N'@RecordCount int OUTPUT',@RecordCount OUTPUT SET @PageCount=ceiling(@RecordCount*1.0/@PageSize) ---------------------------计算总计录数结束---------------------------------- if @PageIndex >@PageCount SET @PageIndex = @PageCount if @PageCount=0 SET @PageIndex = 1 if @PageIndex<=0 SET @PageIndex = 1 --判断记录数是否大于总记录数 if (@PageIndex-1)*@PageSize>@RecordCount begin SET @PageIndex= @PageCount end if @FieldSearchKey IS NOT NULL AND @FieldSearchKey != ''--是否存在查询条件 SET @strTmp = N' WHERE ' + @FieldSearchKey ELSE SET @strTmp = N'' --当前页面第一条记录的位置序数 SET @PageLowerBound=(@PageIndex-1)* @PageSize +1 --当前页面最后一条记录的位置序数 SET @PageUpperBound = @PageLowerBound + @PageSize -1 ------恢复系统设置----- --SET ROWCOUNT 0 --SET NOCOUNT OFF --设置返回记录的SQL语句 ---------------------------ROW_NUMBER 分页--------------------- SET @strSQL = 'SELECT ' + @FieldsList + ' FROM ( SELECT ' + @FieldsList + ',ROW_NUMBER() OVER(' + @OrderString + ') AS RowNumber FROM [' + @TableName + '] ' + @strTmp + ' ) Table_StocPage WHERE RowNumber BETWEEN ' + Cast(@PageLowerBound as nvarchar) + ' AND ' + Cast(@PageUpperBound as nvarchar)+' ' + @OrderString --print @strSQL; EXECUTE(@strSQL)