版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengkang511/article/details/51126791
逻辑很简单,就是双top分页存储过程,复杂的是对特殊情况的处理,比如最后一页数据的处理,当最后一页数据数量没有分页数量大时的特殊处理,不然由于双top的特性,最后一页肯定是每页所分的数量。具体思路在文中已写的很明显。
create PROCEDURE [dbo].[Proc_GetData]
@TableList VARCHAR(2000)='', --查询字段
@TableName VARCHAR(200)='', --表名
@SelectWhere VARCHAR(3000) = '' ,--查询条件
@SelectOrder VARCHAR(200) = '' , --排序规则
@intPageNo INT , --页号
@intPageSize INT --每页显示数
AS
BEGIN
SET NOCOUNT ON
DECLARE
@Pro_TableList VARCHAR(2000),
@Pro_TableName VARCHAR(200),
@Pro_SelectWhere VARCHAR(3000) = '' ,
@Pro_SelectOrder VARCHAR(200) = '' ,
@Pro_intPageNo INT ,
@Pro_intPageSize INT
SET @Pro_TableList=@TableList
SET @Pro_TableName=@TableName
SET @Pro_SelectWhere=@SelectWhere
SET @Pro_SelectOrder=@SelectOrder
SET @Pro_intPageNo=@intPageNo
SET @Pro_intPageSize=@intPageSize
DECLARE @Temp NVARCHAR(4000) ,@TempTotal NVARCHAR(4000) ,@Total INT,@count INT
SET @TempTotal='select @Total=count(1) FROM '+@TableName+' WHERE 1=1 '+@Pro_SelectWhere
EXECUTE sp_executesql @TempTotal, --执行上面的sql语句
N'@Total int OUTPUT', --执行输出数据的sql语句,output出总记录数
@Total OUTPUT
SET @count=@Pro_intPageSize*@intPageNo
DECLARE @Rem INT=0
IF @count>@Total --页码*每页条数 > 符合条件的总数,即最后一页需要做特殊处理
BEGIN
SET @Rem=@count-@Total --计算出余数,则该页查询的条数=每页条数-余数
END
IF @Rem>@Pro_intPageSize
BEGIN
SET @Rem=@Pro_intPageSize
SET @count=0 --如果余数>每页条数,说明页码超过最大页码的范围,查询结果应该是0条数据
END
SET @Temp='
SELECT * FROM(
SELECT TOP '+STR(@Pro_intPageSize-@Rem)+' * FROM (
SELECT TOP '+STR(@count)+' ROW_NUMBER() OVER(ORDER BY '+@Pro_SelectOrder+') new_id,'+STR(@Total)+' total,'+@Pro_TableList+' FROM '+@TableName+' WHERE 1=1 '+@Pro_SelectWhere+' ORDER BY '+@Pro_SelectOrder+'
)a ORDER BY a.new_id desc
) b ORDER BY b.new_id'
print @Temp
EXECUTE sp_executesql @Temp
SET NOCOUNT OFF
END