使用 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 子句中。