我正在使用SET ROWCOUNT
,因为该值来自我的过程中的参数。
SET ROWCOUNT @take
SELECT * FROM Something
SET ROWCOUNT 0
是否可以同时执行另一个过程并获取行计数设置,或者在存储过程中使用它是否完全安全?
我正在使用SET ROWCOUNT
,因为该值来自我的过程中的参数。
SET ROWCOUNT @take
SELECT * FROM Something
SET ROWCOUNT 0
是否可以同时执行另一个过程并获取行计数设置,或者在存储过程中使用它是否完全安全?
行数特定于您当前的范围,因此您在那里是安全的。但是,在线图书告诉我这一点(这可能会也可能不会影响您的需求):
使用 SET ROWCOUNT 不会影响 SQL Server 下一版本中的 DELETE、INSERT 和 UPDATE 语句。不要在新的开发工作中将 SET ROWCOUNT 与 DELETE、INSERT 和 UPDATE 语句一起使用,并计划修改当前使用它的应用程序。此外,对于当前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 语句,我们建议您重写它们以使用 TOP 语法。有关详细信息,请参阅删除 (Transact-SQL)、插入 (Transact-SQL) 或更新 (Transact-SQL)。
TOP 也可以使用变量,现在可以在 INSERT、UPDATE 和 DELETE 语句中使用。(嘿,我今天学到了一些新东西。)在在线图书中查找如何将 TOP 与变量一起使用。
我像这样使用它 FOR SELECT ONLY 所以它不会被弃用作为监视器线程我需要从这个表中选择所有待处理的行但是,作为进程线程我只想一次处理 10 行但我不想在我的存储过程中使用意大利面条代码,所以这是我的解决方案:
参数(@top int = 0)
IF @TOP > 0
SET ROWCOUNT @TOP -- only put a cap on the select if we pass in the @top value
-- select as normal select * from aTable -- 获取所有行或获取虚拟“top (@top)” -- 示例:exec up_myProc @top=10 -- 获得前 10 -- exec up_myProc @top=0 - - 获取所有行
对不起 Necro,只是在 SQLServer 2016 上偶然发现了这一点,并认为它可能很有趣:如果您使用的是 a SELECT <x> INTO tabY from tabX
,如果您有 SET ROWCOUNT <> 0,这也会受到影响,即使此选择发生在您所在的过程中打电话。所以要小心。