/*
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)