SQL Server 2005 引入 ROW_NUMBER() OVER (ORDER BY ...),可高效實現分頁,避免舊版 TOP ... WHERE NOT IN 的效能問題。
DECLARE @StartIndex INT = 1; -- 當頁起始序號 (如第 1 筆)
DECLARE @EndIndex INT = 20; -- 當頁結束序號 (如第 20 筆)
-- 亦可由 @PageSize、@PageIndex 計算得出
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (ORDER BY OrderColumn) AS RowNum
FROM TableName
) AS PagedResult
WHERE PagedResult.RowNum BETWEEN @StartIndex AND @EndIndex;
OrderColumn:決定排序依據的欄位,建議有索引支援。COUNT(*) OVER() (2008+) 或另行查詢。ORDER BY 欄位有適當索引 (覆蓋索引更佳)。SELECT *,僅選取必要欄位。此為 SQL Server 2005 時代最通用、效能最佳的分頁寫法,至今仍廣泛使用。