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;


原文鏈接:SQL Server通用分頁存儲過程兩種用法