【问题标题】:What is the worst that could happen if I don't use SET NOCOUNT ON in a stored procedure in T-SQL?如果我不在 T-SQL 的存储过程中使用 SET NOCOUNT ON,可能发生的最坏情况是什么?
【发布时间】:2018-08-27 21:25:17
【问题描述】:

MSDN 状态

SET NOCOUNT ON 防止将 DONE_IN_PROC 消息发送到 存储过程中的每个语句的客户端。对于存储过程 包含几个不返回太多实际数据的语句, 或对于包含 Transact-SQL 循环的过程,设置 SET NOCOUNT 到 ON 可以提供显着的性能提升,因为网络 流量大大减少。

减少网络流量是使用 NOCOUNT ON 的唯一原因,还是有其他作用?

【问题讨论】:

标签: sql-server nocount


【解决方案1】:

您不会从 proc 中获得受影响的行数。

我认为this question and answerespecially Remus's about performance 中包含的链接会有所帮助。

它在某些情况下对某些开发人员有帮助,尤其是在调试时对 DBA 有帮助。

【讨论】:

    【解决方案2】:

    在较旧的 API(ADO,在 ADO.Net 之前)中,它会对从 proc 返回的内容感到困惑。它会认为 X row(s) affected 是您正在寻找的结果集。它会返回那个,而不是你选择的任何东西。

    不过,这似乎不再是问题了。

    【讨论】:

      【解决方案3】:

      有很多地方你不希望存储过程的任何输出。例如,使用临时表和最终选择的存储过程将显示每个部分受影响的行数,如果它依赖于存储过程的返回,这可能会混淆调用存储过程的任何内容。正如其他答案所说,这可能是一些调用库的问题。

      也绝对是你有一个循环的问题,因为你最终可能会为某些(写得不好的)程序产生数千个计数。

      所以在回答中,您可能发现您需要打开 NOCOUNT,或者您可能需要在大部分例程中将 NOCOUNT 设置为 ON,但只需将其关闭即可在您最终查询之前,或者您可能可以不理会它。

      大多数时候这不是问题,但如果事情不正常,请注意它可能是问题的根源。

      【讨论】:

        猜你喜欢
        • 2010-12-01
        • 1970-01-01
        • 2016-11-03
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 2013-07-23
        • 2014-05-03
        • 1970-01-01
        相关资源
        最近更新 更多