如果我在T-SQL的存储过程中不使用SET NOCOUNT ON,可能发生的最坏情况是什么?

时间:2018-08-27 21:25:18

标签: sql-server nocount

MSDN状态

  

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

在较旧的API(ADO,在ADO.Net之前)中,它将对proc返回的内容感到困惑。会认为X row(s) affected是您要查找的结果集。它会返回该值,而不是您选择的值。

这似乎不再是问题。

答案 2 :(得分:0)

在许多地方,您都不希望存储的过程产生任何输出。例如,使用临时表然后进行最终选择的存储过程将显示每个部分受影响的行数,并且如果它依赖于存储过程的返回值,则可以将调用存储过程的任何内容混为一谈。正如其他答案所说,这对于某些调用库可能是个问题。

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

因此,在答案中,您可能发现您需要打开NOCOUNT,或者您可能需要在大多数例程中将NOCOUNT设置为ON,但只需将其关闭即可在您进行最终查询之前,或者您可能可以不理会它。

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