通用分頁存儲過程 Turnpage,支援任意查詢欄位、多表連接條件、自訂排序鍵與分頁大小,採動態 SQL 組裝 TOP + NOT IN 邏輯實現高效分頁。
| 參數 | 類型 | 說明 |
|---|---|---|
| @qCols | VARCHAR(200) | 查詢欄位清單 |
| @qTables | VARCHAR(200) | 表名與 JOIN/WHERE 條件 |
| @iKey | VARCHAR(20) | 唯一識別欄位 (主鍵) |
| @oKey | VARCHAR(20) | 排序欄位 |
| @pageSize | INT | 每頁筆數 |
| @pageNumber | INT | 頁碼 (從 0 開始) |
CREATE PROC Turnpage
@qCols VARCHAR(200), @qTables VARCHAR(200), @iKey VARCHAR(20),
@oKey VARCHAR(20), @pageSize INT, @pageNumber INT
AS
SET NOCOUNT ON
DECLARE @sqlText VARCHAR(1000), @sqlTable VARCHAR(1000)
-- 內層查詢:取前 (pageNumber+1)*pageSize 筆,按排序鍵 DESC
SET @sqlTable = 'SELECT TOP ' + CAST((@pageNumber + 1) * @pageSize AS VARCHAR(30))
+ ' ' + @qCols + ' FROM ' + @qTables + ' ORDER BY ' + @oKey + ' DESC'
-- 外層查詢:取前 pageSize 筆,排除前 pageNumber*pageSize 筆的識別鍵
SET @sqlText = 'SELECT TOP ' + CAST(@pageSize AS VARCHAR(30)) + ' * FROM (' + @sqlTable + ') AS tableA '
+ 'WHERE ' + @iKey + ' NOT IN (SELECT TOP ' + CAST(@pageNumber * @pageSize AS VARCHAR(30))
+ ' ' + @iKey + ' FROM (' + @sqlTable + ') AS tableB)'
EXEC (@sqlText)
-- PRINT @sqlText -- 除錯用
GO
NOT IN 跳過前幾頁。NOT IN 會誤刪重複鍵值的資料列。ROW_NUMBER() OVER() 窗口函數分頁)。