SQL里ROWCOUNT的使用

本文详细介绍了 SQL Server 中 ROWCOUNT 和 TOP 关键字的使用方式,包括它们的功能、语法和注意事项。通过实例展示了如何在查询中使用 ROWCOUNT 控制返回的行数,并解释了与 TOP 的区别。特别强调了 ROWCOUNT 在不同场景下的应用和限制,如与 DELETE、INSERT 和 UPDATE 语句的配合使用。同时,提供了实际操作中的代码示例,帮助读者更好地理解并实践这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直不学无术,所以也就一直懵懵懂懂。

 

之前有朋友问起以下代码怎么不行:

 

declare @rowcount int;
set @rowcount = 10;
select top @rowcount * from table

 

这个是因为,TOP 只接受常量做数量参数,而不能接受变量,给对方提供的解决方案是:

 

declare @sql nvarchar(4000);
set @sql = 'select top ' + convert(varchar(10), @rowcount+ ' * from table'

exec(@sql)

 

刚在博问里,人问起 rowcount 的用法,查了下,文档里是这样说的:

 

 



使 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 的设置是在执行时或运行时设置,而不是在分析时设置。

权限

要求具有 public 角色的成员身份。

示例

SET ROWCOUNT 在达到指定的行数后停止处理。请注意,在下面的示例中共有 545 行满足 Quantity 小于 300 的条件。但是,从更新后返回的行数可以看出并非所有行都得到了处理。ROWCOUNT 影响所有的 Transact-SQL 语句。


复制代码
USE AdventureWorks2008R2; GO SELECT count(*) AS Count FROM Production.ProductInventory WHERE Quantity < 300; GO

下面是结果集:

Count

-----------

537

(1 row(s) affected)

现在,将 ROWCOUNT 设置为 4,并以 Quantity 小于 300 的条件更新所有行。


复制代码
SET ROWCOUNT 4; UPDATE Production.ProductInventory SET Quantity = 400 WHERE Quantity < 300; GO

(4 row(s) affected)

 



于是醍醐灌顶,对朋友的问题得出新的解决方案:

 

 

declare @rowcount int;
set @rowcount = 1;
set rowcount @rowcount

SELECT * FROM table

 

 

转载于:https://www.cnblogs.com/Daview/archive/2012/07/03/2574696.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值