SET ROWCOUNT 1 与 TOP(1) 的区别
都能实现只取得一条语句。。
使 SQL Server 在返回指定的行数之后停止处理查询。
Transact-SQL 语法约定
语法
SET ROWCOUNT { number | @number_var } |
参数
-
在停止特定查询之前要处理的行数(整数)。
number | @number_var
备注
重要提示: |
---|
在 SQL Server 的下一个版本中,使用 SET ROWCOUNT 将不会影响 DELETE、INSERT 和 UPDATE 语句。在新的开发工作中,避免将 SET ROWCOUNT 语句与 DELETE、INSERT 和 UPDATE 语句一起使用,并计划修改当前使用该语句的应用程序。另外,对于当前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 语句,建议您使用 TOP 语法重写它们。有关详细信息,请参阅 DELETE (Transact-SQL)、INSERT (Transact-SQL) 或 UPDATE (Transact-SQL)。
|
对于在远程表和本地及远程分区视图上执行的 INSERT、UPDATE 和 DELETE 语句,将忽略 SET ROWCOUNT 选项设置。
要将此选项设置为 off 以便返回所有的行,请将 SET ROWCOUNT 指定为 0。
注意: |
---|
设置 SET ROWCOUNT 选项将使大多数 Transact-SQL 语句在受到指定数目的行影响后停止处理。这包括触发器和 INSERT、UPDATE 及 DELETE 等数据修改语句。ROWCOUNT 选项对动态游标无效,但它可以限制键集的行集和不区分游标。应谨慎使用该选项,它主要与 SELECT 语句一起使用。
|
如果行数值较小,则 SET ROWCOUNT 将覆盖 SELECT 语句 TOP 关键字。
当 INSERT、UPDATE 和 DELETE 语句使用显式 TOP 表达式时,这些语句将忽略 SET ROWCOUNT。这包括 INSERT 后跟 SELECT 子句的语句。
SET ROWCOUNT 的设置是在执行时或运行时设置,而不是在分析时设置。
指定查询结果中将只返回第一组行。这组行可以是某一数量的行也可以是某一百分比数量的行。TOP 表达式可用在 SELECT、INSERT、UPDATE 和 DELETE 语句中。
Transact-SQL 语法约定
语法
[ TOP (expression) [PERCENT] [ WITH TIES ] ] |
参数
-
expression
-
指定返回行数的数值表达式。如果指定了 PERCENT,则 expression 将隐式转换为 float 值;否则,它将转换为 bigint。
在 INSERT、UPDATE 和 DELETE 语句中,需要使用括号来分隔 TOP 中的 expression。为保证向后兼容性,支持在 SELECT 使用不包含括号的 TOP expression,但不推荐这种用法。
如果查询包含 ORDER BY 子句,则将返回按 ORDER BY 子句排序的前 expression 行或 expression% 的行。如果查询没有 ORDER BY 子句,则行的顺序是随意的。
-
PERCENT
-
指示查询只返回结果集中前 expression % 的行。
-
WITH TIES
-
指定从基本结果集中返回额外的行,对于 ORDER BY 列中指定的排序方式参数,这些额外的返回行的该参数值与 TOP n (PERCENT) 行中的最后一行的该参数值相同。只能在 SELECT 语句中且只有在指定 ORDER BY 子句之后,才能指定 TOP...WITH TIES。
注意: 返回的记录关联顺序是任意的。SORT BY 不会影响此规则。
备注
在已分区视图中,不能将 TOP 与 UPDATE 和 DELETE 语句一起使用。
与 INSERT、UPDATE 或 DELETE 一起使用的 TOP 表达式中被引用行将不按任何顺序排列。TOP n 随机返回 n 行。例如,下面的 INSERT
语句包含 ORDER BY
子句,但该子句并不影响由 INSERT
语句直接引用的行。
![]() | |
---|---|
INSERT TOP (2) INTO Table2 (ColumnB) SELECT ColumnA FROM Table1 ORDER BY ColumnA |
前一个查询中的 ORDER BY
子句仅引用嵌套 SELECT
语句返回的行。INSERT
语句选择 SELECT
语句返回的任意两行。若要确保插入 SELECT
子查询返回的前两行,请按如下所示重写该查询。
复制代码 | |
---|---|
INSERT INTO Table2 (ColumnB) SELECT TOP (2) ColumnA FROM Table1 ORDER BY ColumnA |
Microsoft SQL Server 2005 允许更新使用 TOP 子句创建的视图。由于 TOP 子句包含在视图定义中,所以如果更新后结果不再符合 TOP 表达式的要求,则可能导致某些行从视图中消失。有关详细信息,请参阅通过视图修改数据。
查询中的 TOP 表达式不影响由于触发器被激发而执行的语句。触发器中已插入和已更新的表中将只显示确实受 INSERT、UPDATE 或 DELETE 语句影响的那些行。
示例
A. 在 TOP 中使用变量
以下示例使用变量获取 AdventureWorks
数据库的 dbo.Employee
表中列出的前 10
个雇员。
复制代码 | |
---|---|
USE AdventureWorks ; GO DECLARE @p AS int SET @p='10' SELECT TOP(@p)* FROM HumanResources.Employee; GO |
B. 在 TOP 中使用 PERCENT 和 WITH TIES
以下示例获取所有雇员中薪金最高的 10
个百分比的雇员,并根据基本薪金按降序返回。指定 WITH TIES
可确保结果集中同时包含其薪金与返回的最低薪金相同的所有雇员,即使这样做会超过雇员总数的 10
个百分比。
复制代码 | |
---|---|
USE AdventureWorks ; GO SELECT TOP(10) PERCENT WITH TIES c.FirstName, c.LastName, e.Title, e.Gender, r.Rate FROM Person.Contact c INNER JOIN HumanResources.Employee e ON c.ContactID = e.ContactID INNER JOIN HumanResources.EmployeePayHistory r ON r.EmployeeID = e.EmployeeID ORDER BY Rate DESC; |