SqlServer-儲存過程分頁

七海桑城發表於2018-08-31

學習資料參考:https://blog.csdn.net/bodilove/article/details/73991783

                          https://www.cnblogs.com/JustYong/p/6078353.html

第一種

CREATE PROCEDURE [dbo].[OrderInfo_PAGE]
    @TableName VARCHAR(50),            --表名
    @ReFieldsStr VARCHAR(200) = '*',   --欄位名(全部欄位為*)
    @OrderString VARCHAR(200),         --排序欄位(必須!支援多欄位不用加order by)
    @WhereString VARCHAR(500) =N'',  --條件語句(不用加where)
    @PageSize INT,                     --每頁多少條記錄
    @PageIndex INT = 1 ,               --指定當前為第幾頁
    @TotalRecord INT OUTPUT            --返回總記錄數
AS
BEGIN
     --處理開始點和結束點
    DECLARE @StartRecord INT;
    DECLARE @EndRecord INT; 
    DECLARE @TotalCountSql NVARCHAR(500); 
    DECLARE @SqlString NVARCHAR(2000);    
    SET @StartRecord = (@PageIndex-1)*@PageSize + 1--起始記錄
    SET @EndRecord = @StartRecord + @PageSize - 1 --結尾記錄
    SET @TotalCountSql= N'select @TotalRecord = count(*) from ' + @TableName;--總記錄數語句
    SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName;--查詢語句
    --
    IF (@WhereString! = '' or @WhereString!=null)
        BEGIN
            SET @TotalCountSql=@TotalCountSql + '  where '+ @WhereString;
            SET @SqlString =@SqlString+ '  where '+ @WhereString;            
        END
    --第一次執行得到
    EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord OUTPUT;--返回總記錄數
    ----執行主語句
    SET @SqlString ='select * from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' +  ltrim(str(@EndRecord));
    Exec(@SqlString)    
END

declare @totalCount int
exec OrderInfo_PAGE 'OrderProduct','*','OrderGuid','',3,1,@totalCount output; 
select @totalCount as totalCount;--總記錄數。

declare @totalCount int
exec OrderInfo_PAGE 'OrderProduct','*','OrderGuid','',3,1,@totalCount output; 

exec OrderInfo_PAGE 'OrderProduct','*','OrderGuid','',3,2,@totalCount output; 
select @totalCount as totalCount;--總記錄數。

第二種-使用臨時表

IF EXISTS(SELECT * FROM SYSOBJECTS WHERE NAME='TempPage')
 DROP PROC TempPage
GO
CREATE PROCEDURE TempPage 
    @PageSize INT, --每頁大小
    @PapeIndex INT, --當前索引
    @PageCount INT OUTPUT, --返回總頁數
    @RecordCount INT OUTPUT --返回總記錄條數
AS
BEGIN
    --先建立臨時表存放表連線查詢資料
    SELECT * INTO #NewsTemp FROM 
    (
         SELECT 
         OP.OrderGuid,
         OP.ProductGuid,
         OP.ProductName,
         O.LoginId ,
         ROW_NUMBER() OVER(ORDER BY OP.OrderGuid DESC) AS RowNumber 
         FROM OrderProduct AS OP 
         INNER JOIN OrderInfo AS O ON O.OrderGuid=OP.OrderGuid
     ) T
    --從臨時表中查詢分頁資料
    SELECT * FROM #NewsTemp WHERE RowNumber BETWEEN @PageSize*(@PapeIndex-1)+1 AND (@PageSize*@PapeIndex)
    --查詢總記錄條數
    SELECT @RecordCount=COUNT(1) FROM #NewsTemp
    --計算總頁數
    SET @PAGECOUNT = CEILING(@RecordCount*1.0/@PageSize)
END

declare @pagecount int --接收總頁數
declare @recordcount int --接收總記錄條數
exec TempPage 4,1,@pagecount output, @recordcount output
select @pagecount as [pagecount];
select @recordcount as recordcount;

IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N'[DBO].[paging_procedure]') AND OBJECTPROPERTY(ID, N'IsProcedure') = 1)
    DROP PROCEDURE [DBO].[paging_procedure]
GO
CREATE PROCEDURE paging_procedure 
    @PageSize INT, --每頁大小
    @PapeIndex INT, --當前索引
    @PageCount INT OUTPUT, --返回總頁數
    @RecordCount INT OUTPUT --返回總記錄條數
AS
BEGIN
    SELECT TOP (SELECT @PageSize) *     -- 這裡注意一下,不能直接把變數放在這裡,要用SELECT
    FROM (SELECT ROW_NUMBER() OVER(ORDER BY OrderGuid) AS RowNumber,* FROM OrderProduct) TEMP_ROW 
    WHERE RowNumber>(@PapeIndex-1)*@PageSize;
    --查詢總記錄條數
    SELECT @RecordCount=COUNT(1) FROM OrderProduct
    --計算總頁數
    SET @PAGECOUNT = CEILING(@RecordCount*1.0/@PageSize)
END


declare @pagecount int --接收總頁數
declare @recordcount int --接收總記錄條數
exec paging_procedure 4,1,@pagecount output, @recordcount output
select @pagecount as [pagecount];
select @recordcount as recordcount;

 

相關文章