zoukankan      html  css  js  c++  java
  • SQL SERVER 通用分页存储过程,两种用法任你选

    写在前面

            从SQLSERVER 2005开始,提供了Row_Number()函数,利用函数生成的Index来处理分页,按照正常的逻辑思维都是传pageIndex和pageSize来完成分页,昨天前端和我沟通,他们使用jQuery.DataTable.js插件,而且经过了公司底层的封装,pageIndex需要变动一下,变成pageIndex*pageSize来传。 也就是说按每页显示30条算,第一次传0,第二次传30这样来计算,我也是醉了。

    1、传pageIndex和pageSize

    CREATE PROC [dbo].[Common_PageList]
    (
    @tab nvarchar(max),---表名
    @strFld nvarchar(max), --字段字符串
    @strWhere varchar(max), --where条件 
    @PageIndex int, --页码
    @PageSize int, --每页容纳的记录数
    @Sort VARCHAR(255), --排序字段及规则,不用加order by
    @IsGetCount bit  --是否得到记录总数,1为得到记录总数,0为不得到记录总数,返回记录集
    )
    AS
    declare @strSql nvarchar(max)
    set nocount on;
    if(@IsGetCount = 1)
    begin
     set @strSql='SELECT COUNT(0) FROM ' + @tab + ' WHERE ' + @strWhere
    end
    else
    begin
      set @strSql=' SELECT * FROM (SELECT ROW_NUMBER() 
      OVER(ORDER BY ' + @Sort + ') AS rownum, ' + @strFld + ' FROM ' + @tab + ' where ' + @strWhere + ') AS Dwhere
      WHERE rownum BETWEEN ' + CAST(((@PageIndex-1)*@PageSize + 1) as nvarchar(20)) + ' and ' + cast((@PageIndex*@PageSize) as nvarchar(20))
    end
    
    exec (@strSql)
    
    set nocount off;

    2、传pageIndex*pageSize和pageSize

    CREATE PROC [dbo].[Common_PageList2]
    (
    @tab nvarchar(max),---表名
    @strFld nvarchar(max), --字段字符串
    @strWhere varchar(max), --where条件 
    @StartIndex int, -- 开始行数
    @PageSize int, --每页容纳的记录数
    @Sort VARCHAR(255), --排序字段及规则,不用加order by
    @IsGetCount bit  --是否得到记录总数,1为得到记录总数,0为不得到记录总数,返回记录集
    )
    AS
    DECLARE @strSql NVARCHAR(max)
    SET NOCOUNT ON;
    IF(@IsGetCount = 1)
    BEGIN
     SET @strSql='SELECT COUNT(0) FROM ' + @tab + ' WHERE ' + @strWhere
    END
    ELSE
    BEGIN
      DECLARE @ENDINDEX INT
      IF(@StartIndex>0)
        BEGIN
          SET @ENDINDEX=@StartIndex+@PageSize
          SET @StartIndex=@StartIndex+1
        END
      ELSE
        SET @ENDINDEX=@StartIndex+@PageSize
         
        SET @strSql=' SELECT * FROM (SELECT ROW_NUMBER() 
      OVER(ORDER BY ' + @Sort + ') AS rownum, ' + @strFld + ' FROM ' + @tab + ' where ' + @strWhere + ') AS Dwhere
      WHERE rownum BETWEEN ' + CAST(@StartIndex AS VARCHAR(30)) + ' and ' + CAST(@ENDINDEX AS VARCHAR(30))
    end
    
    exec (@strSql)
    
    SET NOCOUNT OFF;
  • 相关阅读:
    poj3278 Catch That Cow
    poj2251 Dungeon Master
    poj1321 棋盘问题
    poj3083 Children of the Candy Cor
    jvm基础知识—垃圾回收机制
    jvm基础知识1
    java面试基础必备
    java soket通信总结 bio nio aio的区别和总结
    java scoket aIO 通信
    java scoket Blocking 阻塞IO socket通信四
  • 原文地址:https://www.cnblogs.com/sword-successful/p/4834309.html
Copyright © 2011-2022 走看看