页结果
通过名为 OFFSET-FETCH 的 ORDER BY 子句的扩展,可以仅返回查询选择的某一范围内的行。 该扩展增加了以下功能:提供一个起点(偏移量)和一个值,以指定要返回的行数(提取值)。 该扩展提供了一种方便的方法来对结果进行分页。
如果希望一次在一页中返回行(使用为页选择的任何数字),则需要考虑每个带有 OFFSET-FETCH 子句的查询独立于任何其他查询运行。 不会维护服务器端状态,用户需要利用客户端代码,通过结果集跟踪你的位置。
OFFSET-FETCH 语法
OFFSET-FETCH 子句的语法在技术方面是 ORDER BY 子句的一部分,如下所示:
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY]
使用 OFFSET-FETCH
要使用 OFFSET-FETCH,需要提供起始 OFFSET 值(可能为零)和可选的要返回的行数,如以下示例所示:
此示例将返回前 10 行,然后根据“ListPrice”返回接下来的 10 行产品数据:
SELECT ProductID, ProductName, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC
OFFSET 0 ROWS --Skip zero rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
要检索下一页产品数据,请使用 OFFSET 子句指定要跳过的行数:
SELECT ProductID, ProductName, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC
OFFSET 10 ROWS --Skip 10 rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
在语法定义中,可以看到需要 OFFSET 子句,但不需要 FETCH 子句。 如果省略 FETCH 子句,则将返回 OFFSET 之后的所有行。 用户还会发现,关键字 ROW 和 ROWS 可以互换,就像 FIRST 和 NEXT 一样,这可实现更自然语法。
要确保结果的准确性,尤其是切换不同的数据页时,务必要构造一个 ORDER BY 子句,该子句将提供唯一排序并产生确定的结果。 由于 SQL Server 的查询优化器的工作方式,在多页上显示行在技术上可以实现,除非行范围是确定性的。