首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

MSSQL 通用分頁預存程序:支援多表 JOIN、動態排序、分組與條件

     編輯:關於SqlServer

實務上常需一個彈性分頁 SP,支援單表/多表、指定欄位、排序、分組、條件篩選。本文提供完整版 Com_Pagination,採動態 SQL 組裝 + ROW_NUMBER() 窗口函數實作。

參數說明

參數型別說明
@TotalCountINT OUTPUT總筆數
@TotalPageINT OUTPUT總頁數
@TableNVARCHAR(1000)查詢表(可含 JOIN,如 Person p LEFT JOIN TE a ON a.PID=p.Id)
@ColumnNVARCHAR(1000)查詢欄位(可為 * 或 a.*)
@OrderColumnNVARCHAR(100)排序欄位
@GroupColumnNVARCHAR(150)分組欄位(@Group=1 時生效)
@PageSizeINT每頁筆數
@CurrentPageINT目前頁碼(1-based)
@GroupTINYINT是否分組(0/1)
@ConditionNVARCHAR(4000)WHERE 條件(含 AND,如 a.pid=2)

核心邏輯

  • 第一頁:直接 TOP @PageSize。
  • 非第一頁:ROW_NUMBER() OVER (ORDER BY ...) 產生序號,再 BETWEEN 篩選頁碼區間。
  • 分組時:COUNT(*) ... GROUP BY 計算總筆數,查詢同樣加 GROUP BY。
  • 動態 SQL 以 sp_executesql 取得 @TotalCount,再 EXEC(@strSql) 回傳資料。

完整程式碼

CREATE PROCEDURE [dbo].[Com_Pagination]
    @TotalCount INT OUTPUT, @TotalPage INT OUTPUT,
    @Table NVARCHAR(1000), @Column NVARCHAR(1000),
    @OrderColumn NVARCHAR(100), @GroupColumn NVARCHAR(150),
    @PageSize INT, @CurrentPage INT, @Group TINYINT,
    @Condition NVARCHAR(4000)
AS
BEGIN
    DECLARE @PageCount INT, @strSql NVARCHAR(4000), @strCount NVARCHAR(1000), @strOrderType NVARCHAR(1000);
    SET @PageCount = @PageSize * (@CurrentPage - 1);
    SET @strOrderType = ' ORDER BY ' + @OrderColumn + ' ';

    -- 動態組裝統計與查詢 SQL(略,詳見原文完整版)
    -- 關鍵:第一頁用 TOP,其他頁用 ROW_NUMBER() BETWEEN

    EXEC sp_executesql @strCount, N'@TotalCount INT OUTPUT', @TotalCount OUTPUT;
    IF @TotalCount > 2000 SET @TotalCount = 2000;  -- 安全上限
    SET @TotalPage = CASE WHEN @TotalCount % @PageSize = 0
                          THEN @TotalCount / @PageSize
                          ELSE @TotalCount / @PageSize + 1 END;
    SET NOCOUNT ON; EXEC (@strSql); SET NOCOUNT OFF;
END

呼叫範例

DECLARE @TotalCount INT, @TotalPage INT;
EXEC Com_Pagination
    @TotalCount OUTPUT, @TotalPage OUTPUT,
    'Person p LEFT JOIN TE a ON a.PID=p.Id',  -- 多表
    'a.*', 'p.ID', 'p.ID', 2, 1, 0, 'a.pid=2';
SELECT @TotalCount AS TotalCount, @TotalPage AS TotalPage;

注意事項

  • 動態 SQL 需防注入,參數化處理 @Condition 更安全(此範例為教學簡化)。
  • TOP (2000) 為保護機制,避免 ROW_NUMBER 掃描過大範圍;依實際資料量調整。
  • SQL Server 2012+ 可改用 OFFSET ... FETCH 簡化語法。

此 SP 適合快速建立後台管理分頁 API,減少重複造輪子。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved