我正在使用SET ROWCOUNT
,因为该值来自我的程序中的参数。
SET ROWCOUNT @take
SELECT * FROM Something
SET ROWCOUNT 0
是否可以同时执行另一个过程并获取rowcount设置,或者在存储过程中使用它是否非常安全?
答案 0 :(得分:8)
Rowcount特定于您当前的范围,因此您在那里安全。但是,联机丛书告诉我这(可能会或可能不会影响您的需求):
使用SET ROWCOUNT不会影响 DELETE,INSERT和UPDATE语句 在SQL Server的下一个版本中。做 不要使用带有DELETE的SET ROWCOUNT, 新的INSERT和UPDATE语句 开发工作,并计划修改 目前使用它的应用程序。 此外,对于DELETE,INSERT和UPDATE 目前使用SET的语句 ROWCOUNT,我们建议你 重写它们以使用TOP语法。 有关更多信息,请参阅DELETE (Transact-SQL),INSERT(Transact-SQL), 或UPDATE(Transact-SQL)。
TOP也可以使用变量,现在可以在INSERT,UPDATE和DELETE语句中使用。 (嘿,我今天学到了新东西。)查看如何在联机丛书中使用TOP和变量。
答案 1 :(得分:6)
我正在为可能仍在搜索此内容的人们的利益添加此答案。
使用SET ROWCOUNT不再安全,因为它将在下一版本的SQL Server中弃用:
答案 2 :(得分:0)
我正在使用它,因为它仅供选择,因此它不会被弃用 作为监视器线程我需要从这一个表中选择所有挂起的行,但是, 作为进程线程我只想一次处理10行 但我不想在我的sproc中使用意大利面条代码,所以这是我的解决方案:
参数(@top int = 0)
IF @TOP > 0
SET ROWCOUNT @TOP -- only put a cap on the select if we pass in the @top value
- 正常选择 从aTable中选择* - 获取所有行或获取虚拟“top(@top)” - 例如:exec up_myProc @ top = 10 - 获得前10名 - exec up_myProc @ top = 0 - 获取所有行
答案 3 :(得分:0)
对不起Necro,在SQLServer 2016上偶然发现了这一点,并认为这可能很有趣:
如果您使用的是SELECT <x> INTO tabY from tabX
,则即使SET ROWCOUNT <> 0也将受到影响,即使此选择发生在您正在调用的过程中。所以要小心。