MSDN 状态
SET NOCOUNT ON 防止为存储过程中的每个语句向客户端发送 DONE_IN_PROC 消息。对于包含多个不返回太多实际数据的语句的存储过程,或者对于包含 Transact-SQL 循环的过程,将 SET NOCOUNT 设置为 ON 可以显着提高性能,因为网络流量大大减少。
减少网络流量是使用 NOCOUNT ON 的唯一原因,还是有其他作用?
MSDN 状态
SET NOCOUNT ON 防止为存储过程中的每个语句向客户端发送 DONE_IN_PROC 消息。对于包含多个不返回太多实际数据的语句的存储过程,或者对于包含 Transact-SQL 循环的过程,将 SET NOCOUNT 设置为 ON 可以显着提高性能,因为网络流量大大减少。
减少网络流量是使用 NOCOUNT ON 的唯一原因,还是有其他作用?
您不会从 proc 中获得受影响的行数。
我认为这个问题和答案,以及其中包含的链接,尤其是 Remus 关于性能的链接,会有所帮助。
它在某些情况下对一些开发人员有帮助,尤其是在调试时对 DBA 有帮助。
在较旧的 API(ADO,在 ADO.Net 之前)中,它会对从 proc 返回的内容感到困惑。它会认为这X row(s) affected
是您正在寻找的结果集。它会返回它而不是你选择的任何东西。
不过,这似乎不再是问题了。
有很多地方你不希望存储过程的任何输出。例如,使用临时表和最终选择的存储过程将显示每个部分受影响的行数,如果它依赖于存储过程的返回,这可能会混淆调用存储过程的任何内容。正如其他答案所说,这可能是一些调用库的问题。
也绝对是你有一个循环的问题,因为你最终可能会为某些(写得不好的)程序产生数千个计数。
因此,在回答时,您可能会发现您需要打开 NOCOUNT,或者您可能需要为大部分例程设置 NOCOUNT ON,但在最终查询之前将其关闭,或者您可以不理会它。
大多数时候这不是问题,但如果事情不正常,请注意它可能是问题的根源。