使用SET ROWCOUNT是否安全?

时间:2011-06-03 17:56:14

标签: sql-server sql-server-2008 rowcount

我正在使用SET ROWCOUNT,因为该值来自我的程序中的参数。

SET ROWCOUNT @take 

SELECT * FROM Something

SET ROWCOUNT 0

是否可以同时执行另一个过程并获取rowcount设置,或者在存储过程中使用它是否非常安全?

4 个答案:

答案 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中弃用:

TechNet: Deprecated Database Engine Features

答案 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也将受到影响,即使此选择发生在您正在调用的过程中。所以要小心。