SQL双top分页存储过程

来源:互联网 发布:windows pe 编辑:程序博客网 时间:2024/06/05 05:43

逻辑很简单,就是双top分页存储过程,复杂的是对特殊情况的处理,比如最后一页数据的处理,当最后一页数据数量没有分页数量大时的特殊处理,不然由于双top的特性,最后一页肯定是每页所分的数量。具体思路在文中已写的很明显。

create PROCEDURE [dbo].[Proc_GetData]@TableList VARCHAR(2000)='',         --查询字段@TableName VARCHAR(200)='',          --表名@SelectWhere VARCHAR(3000) = '' ,--查询条件@SelectOrder VARCHAR(200) = '' , --排序规则@intPageNo INT  ,             --页号@intPageSize INT           --每页显示数ASBEGIN    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 OFFEND
1 0
原创粉丝点击