SQL双top分页存储过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/fengkang511/article/details/51126791