【问题标题】:Is "SET NOCOUNT OFF" necessary in a stored procedure?存储过程中是否需要“SET NOCOUNT OFF”?
【发布时间】:2011-11-21 19:13:24
【问题描述】:

我有很多程序都有set nocount on

是否需要在存储过程结束时关闭它?

例如:

create procedure DummyProc
as
begin
    set nocount on
    ...
    set nocount off
end

【问题讨论】:

  • 很好的编程习惯,是的。
  • 我觉得问题更多的是“离开on如何影响后续SQL”,不是吗?
  • 旁注:程序结束时无需重新设置设置参数。在一个过程中完成的所有sets 只在该过程中最后。
  • @GSerg - 请发布。这就是答案,我会支持你:)
  • 仅供参考,我回滚了 Adam 的标题更改,就像问题的主体一样,很明显 OP 是在询问 set nocount off

标签: sql sql-server tsql nocount


【解决方案1】:

set nocount on 将禁用 SQL 返回的X rows affected. 消息。在某些情况下,由于客户端执行存储过程的不良影响,此消息会被抑制。

set nocount off 将撤消此抑制。但是,set nocount on 是一个作用域设置,默认情况下,无论如何都会在离开作用域时关闭。

现在,set nocount off 有必要吗?不,因为执行的任何新命令都将在不同的范围内,默认情况下set nocount off 始终有效。但是正如上面在 cmets 中所说的,这被认为是一种很好的做法,只是为了明确表明该设置将在 proc 执行完成后恢复正常。

【讨论】:

  • 有趣的是,在 SQL Management Studio 中通过选择“创建新存储过程”生成的存储过程模板中没有“设置 nocount off”
  • 关于客户端的不良影响,一个这样的例子是 JDBC 驱动程序 - 行数会干扰通过 JDBC 检索结果集。
  • 传播良好的范围界定知识是更好的做法。否则,解释/写这个的“正确”方式是什么:set nocount on; ..; if x = 1 return 1; set nocount off?如果不了解作用域行为并正确应用它,就没有好办法。
【解决方案2】:

我知道这是一篇相当老的帖子,但当我寻找答案时,它是谷歌上的第一个热门话题。上面的响应来测试它是一个非常好的主意。

我对此进行了测试,并想用一些额外的细节来更新上面的内容。

您使用 SET NOCOUNT ON 创建的范围流向您的过程调用的任何 proc。因此,如果您的过程执行了 SET NOCOUNT ON 然后您调用了一个 sproc,该 sproc 将获得您的 SET NOCOUNT 设置。当您退出存储过程时,设置会消失,但设置会向下流入调用的存储过程。如果在 CALLED sproc 内设置 SET NOCOUNT,则外部 sproc 将具有它设置的 SET NOCOUNT,而内部 sproc 不会影响外部 sproc。

所以我认为您实际上不需要在存储过程结束时重置它,因为您的设置永远不会向上流出存储过程;但是,如果您的 sproc 依赖于设置,它应该在需要它之前设置它,因为如果它被另一个 sproc 调用,它可能具有与您假设的不同的设置。

【讨论】:

    【解决方案3】:

    只有当你不想看到的时候

    (1 row(s) affected) // or n rows....
    

    大部分时间 - 调试时

    你使用打印命令 - 所以你想看到你自己的纯文本......所以这是一个很好的做法。

    编辑

    它不会影响您的查询结果(打开或关闭 - 没关系。) - 如果这就是您的要求。 (感谢 JNK)。

    【讨论】:

    • -1 - 不回答问题。他问的是“这会影响存储过程之后运行的其他 SQL”,而不是“nocount 做什么?”
    • 仍然没有解决他的问题。他想知道不重新打开它是否会影响 proc 之后运行的任何内容。
    【解决方案4】:

    很简单。如果另一个程序正在运行您的程序,则不需要它。 假设我的 python 代码正在调用 mssql 过程,那么我的应用程序不需要受影响的行数,所以我“应该”肯定在我的代码中放置“set nocount on”

    【讨论】:

    • 感谢您分享这个十年前的问题的答案(我什至不知道我什至问过这个问题;p)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 2011-01-25
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多