支援單表/多表、可輸出總筆數、動態建構 SQL 字串執行,適合 SQL Server 2000 環境。
| 參數 | 類型 | 預設值 | 說明 |
|---|---|---|---|
| @TName | NVARCHAR(100) | - | 資料表名稱(支援 JOIN 語法) |
| @FName | NVARCHAR(255) | - | 查詢欄位清單 |
| @OName | NVARCHAR(255) | - | 排序欄位名稱 |
| @ODirect | BIT | 1 | 排序方向:1=DESC(降冪),0=ASC(升冪) |
| @PSize | INT | 10 | 每頁筆數 |
| @PIndex | INT | 1 | 頁碼(從 1 開始) |
| @sWhere | NVARCHAR(1000) | '' | WHERE 條件(不含 WHERE 關鍵字) |
| @iCount | INT OUTPUT | 0 | 輸出總筆數 |
SELECT @iCount = COUNT(*) FROM @TName [WHERE @sWhere],使用 sp_executesql 取得 OUTPUT 參數。SELECT TOP @PSize @FName FROM @TName
WHERE @OName @Operator (
SELECT MAX/MIN(@OName) FROM (
SELECT TOP (@PIndex-1)*@PSize+1 @OName FROM @TName [WHERE @sWhere] ORDER BY @OName @Dir
) t
) [AND @sWhere] ORDER BY @OName @Dir
@Operator 根據 @ODirect 決定:DESC 用 >= 配合 MIN,ASC 用 <= 配合 MAX。DECLARE @Total INT
EXEC spPagination
@TName = 'Orders',
@FName = 'OrderID, CustomerID, OrderDate, TotalAmount',
@OName = 'OrderDate',
@ODirect = 1, -- 降冪
@PSize = 20,
@PIndex = 3, -- 第 3 頁
@sWhere = 'CustomerID = ''ALFKI''',
@iCount = @Total OUTPUT
SELECT @Total AS TotalRecords
@OName 欄位有索引(最佳為叢集索引)。ROW_NUMBER() (SQL 2005+) 或 Keyset 分頁法。