【问题标题】:Is it safe to use SET ROWCOUNT?使用 SET ROWCOUNT 是否安全?
【发布时间】:2011-06-03 17:56:13
【问题描述】:

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

SET ROWCOUNT @take 

SELECT * FROM Something

SET ROWCOUNT 0

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

【问题讨论】:

  • 您可以将变量与 select top 一起使用。 select top (@take) * from Something
  • Rowcount 在 SQL Server 2008 中已弃用。如果您正在编写新代码,请不要使用 rowcount,而是使用 TOP。
  • 您能否提供一个明确声明不推荐使用 set rowcount 的链接?因为technet.microsoft.com/en-us/library/ms188774.aspx 没有这么说。

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


【解决方案1】:

行数特定于您当前的范围,因此您在那里是安全的。但是,Books Online 告诉我这一点(这可能会也可能不会影响您的需求):

使用 SET ROWCOUNT 不会影响 DELETE、INSERT 和 UPDATE 语句 在 SQL Server 的下一个版本中。做 不要将 SET ROWCOUNT 与 DELETE 一起使用, 新的 INSERT 和 UPDATE 语句 开发工作,并计划修改 当前使用它的应用程序。 此外,对于 DELETE、INSERT 和 UPDATE 当前使用 SET 的语句 ROWCOUNT,我们建议您 重写它们以使用 TOP 语法。 有关详细信息,请参阅删除 (Transact-SQL)、插入 (Transact-SQL)、 或 UPDATE (Transact-SQL)。

TOP 也可以使用变量,现在可以在 INSERT、UPDATE 和 DELETE 语句中使用。 (嘿,我今天学到了一些新东西。)在在线图书中查找如何将 TOP 与变量一起使用。

【讨论】:

  • 但是 TOP 不能在 PDW 中使用。
【解决方案2】:

我添加此答案是为了让可能仍在搜索此内容的人受益。

使用 SET ROWCOUNT 不再安全,因为它将在 SQL Server 的下一版本中被弃用:

TechNet: Deprecated Database Engine Features

【讨论】:

  • 虽然没有完全弃用。从您的链接开始,它显示“为 INSERT、UPDATE 和 DELETE 语句设置 ROWCOUNT”,因此仍应支持 SELECTS。
【解决方案3】:

我像这样使用它 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

-- 正常选择 从表中选择 * -- 要么获取所有行,要么获取一个虚拟的“top (@top)” -- 示例: exec up_myProc @top=10 -- 获得前 10 名 -- exec up_myProc @top=0 -- 获取所有行

【讨论】:

    【解决方案4】:

    对不起 Necro,刚刚在 SQLServer 2016 上偶然发现了这个,并认为它可能很有趣: 如果您使用SELECT <x> INTO tabY from tabX,如果您设置了 SET ROWCOUNT 0,这也会受到影响,即使此选择发生在您正在调用的过程中。所以要小心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 2014-06-06
      • 2015-04-03
      • 1970-01-01
      • 2012-02-22
      • 2016-05-12
      • 1970-01-01
      相关资源
      最近更新 更多