首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 分頁存儲過程通用實現:動態 SQL + TOP + NOT IN 邏輯

     編輯:MySQL 資料庫相關知識

通用分頁存儲過程 Turnpage,支援任意查詢欄位、多表連接條件、自訂排序鍵與分頁大小,採動態 SQL 組裝 TOP + NOT IN 邏輯實現高效分頁。

參數定義

參數類型說明
@qColsVARCHAR(200)查詢欄位清單
@qTablesVARCHAR(200)表名與 JOIN/WHERE 條件
@iKeyVARCHAR(20)唯一識別欄位 (主鍵)
@oKeyVARCHAR(20)排序欄位
@pageSizeINT每頁筆數
@pageNumberINT頁碼 (從 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

原理與注意事項

  • 雙層 TOP:內層取足夠範圍,外層透過 NOT IN 跳過前幾頁。
  • @iKey 必須唯一:否則 NOT IN 會誤刪重複鍵值的資料列。
  • 排序方向固定 DESC:若需 ASC,需調整邏輯或參數化排序方向。
  • 動態 SQL 注入風險:參數來源若不可信,需嚴格驗證或改用參數化查詢(SQL Server 2005+ 建議用 ROW_NUMBER() OVER() 窗口函數分頁)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved