使用 ROW NUMBER 和公用表表示式進行分頁

Version >= SQL Server 2008

ROW_NUMBER 函式可以為結果集中的每一行指定遞增數。結合使用 BETWEEN 運算子的公用表表示式 ,可以建立結果集的頁面。例如:第一頁包含結果 1-10,第二頁包含結果 11-20,第三頁包含結果 21-30,依此類推。

WITH data
AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY name) AS row_id,
        object_id,
        name, 
        type,
        create_date
    FROM sys.objects
)
SELECT *
FROM data
WHERE row_id BETWEEN 41 AND 50

注意:在 WHERE 子句中不能使用 ROW_NUMBER,如:

SELECT object_id,
    name,
    type,
    create_date
FROM sys.objects
WHERE ROW_NUMBER() OVER (ORDER BY name) BETWEEN 41 AND 50

雖然這會更方便,但在這種情況下 SQL Server 將返回以下錯誤:

Msg 4108,Level 15,State 1,Line 6

視窗函式只能出現在 SELECT 或 ORDER BY 子句中。