使用 TOP 和 PERCENT 限制结果集

您可以使用 TOP 子句限制结果集中返回的行数。

TOP ( expression ) [ PERCENT ] [ WITH TIES ]

expression 是指定返回行数的数值表达式,如果指定了 PERCENT,则是指返回的结果集行的百分比(由 expression 指定)。例如:

TOP (120) /*Return the top 120 rows of the result set. */
TOP (15) PERCENT /* Return the top 15 percent of the result set. */.
TOP(@n) /* Return the top @n rows of the result set, with the variable declaration: DECLARE @n AS BIGINT; SET @n = 2 */.

如果一个 SELECT 语句既包含 TOP 又包含 ORDER BY 子句,那么返回的行将会从排序后的结果集中选择。整个结果集按照指定的顺序建立,并且返回排序后的结果集中的前 n 行。如果还指定了 WITH TIES,将返回包含 ORDER BY 子句返回的最后一个值的所有行,即便这样将超过 expression 指定的数量。

TOP 和 SET ROWCOUNT

限制结果集大小的另一种方法是在执行一个语句之前执行 SET ROWCOUNT n 语句。SET ROWCOUNT 与 TOP 的不同之处体现在以下方面:

  • TOP 子句适用于指定了该子句的单个 SELECT 语句。SET ROWCOUNT 将一直有效,直到执行另一个 SET ROWCOUNT 语句,例如 SET ROWCOUNT 0 将关闭该选项。

    重要说明重要提示

    使用 SET ROWCOUNT 不会影响 SQL Server 下一版本中的 DELETE、INSERT 和 UPDATE 语句。应避免在新的开发工作中将 SET ROWCOUNT 与 DELETE、INSERT 和 UPDATE 语句一起使用,并计划修改当前使用它的应用程序。建议重写当前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 语句以使用 TOP。

    尽管 SET ROWCOUNT 对于 SELECT 语句的影响仍未改变,但将 TOP 与 SELECT 一起使用要优于使用 SET ROWCOUNT,原因如下:

    • 当 SELECT、INSERT、UPDATE 和 DELETE 语句影响指定的行数时,SET ROWCOUNT 将导致这些语句中的大多数停止处理。此行为也适用于内部触发器的激发。

    • 作为 SELECT 语句的一部分,查询优化器可以使用 TOP 子句中 expression 的值作为生成查询的执行计划的一部分。由于 SET ROWCOUNT 在执行查询的语句外使用,因此它的值不能用于生成查询的查询计划。