受这个问题的启发,在SET上有不同的观点。
我们是否应该将SET NOCOUNT用于Server?若否,原因为何?
编辑6,2011年7月22日
它会在任何DML之后取消"xx行受影响“消息。这是一个结果集,当发送时,客户端必须处理它。它很小,但是可以测量(见下面的答案)
对于触发器等,客户端将接收多个受影响的"xx行“,这会导致一些ORM、MS Access、JPA等方面的各种错误(参见下面的编辑)。
背景:
一般公认的最佳实践(直到这个问题之前)是在Server中的触发器和存储过程中使用SET NOCOUNT ON。我们在任何地方都使用它,一个快速的google显示了大量的Server也表示同意。
MSDN说,这会破坏.net SQLDataAdapter。
现在,对我来说,这意味着SQLDataAdapter被限制在完全简单的CRUD处理上,因为它期望"n行受影响“消息匹配。所以,我不能用:
在问题中,marc_s (谁知道他的SQL内容)说不要使用它。这与我所认为的不同(我也认为自己在SQL方面有一定的能力)。
也许我遗漏了一些东西(随便指出一些显而易见的事情),但是你们认为呢?
注意:我已经多年没有看到这个错误了,因为我现在不使用SQLDataAdapter了。
在评论和问题之后编辑:
编辑:更多想法..。
我们有多个客户端:一个可以使用C# SQLDataAdaptor,另一个可以使用来自Java的nHibernate。使用SET NOCOUNT ON可以以不同的方式影响这些因素。
如果您将存储过程视为方法,那么假设某些内部处理为您自己的目的以某种方式工作是不好的形式(反模式)。
编辑2:触发中断nHibernate问题,其中无法设置SET NOCOUNT ON
(不,这不是这的复制品)
编辑3:还有更多的信息,感谢我的MVP同事
编辑4: 2011年5月13日
编辑5: 14 2011年6月14日
破坏JPA,用表变量存储proc:JPA2.0支持Server表变量吗?
编辑6: 15 2011年8月15日
SSMS“编辑行”数据网格要求将NOCOUNT设置为:使用组更新触发器
编辑7: 07 2013年3月
详情见@RemusRusanu:
发布于 2009-10-10 10:00:39
好吧,现在我做了我的研究,下面是交易:
在TDS协议中,SET NOCOUNT ON只保存9-每个查询的字节,而文本"SET NOCOUNT ON“本身却高达14字节。我以前认为123 row(s) affected是在一个单独的网络包中以纯文本形式从服务器返回的,但事实并非如此。实际上,它是嵌入在响应中的一个名为DONE_IN_PROC的小结构。这不是一个单独的网络包,所以不会浪费往返时间。
我认为你可以坚持默认计数的行为,几乎总是不用担心表现。但是,在某些情况下,预先计算行数会影响性能,例如只向前游标。在这种情况下,NOCOUNT可能是必要的。除此之外,绝对没有必要遵循“尽可能使用NOCOUNT”的座右铭。
下面是关于SET NOCOUNT设置不重要的详细分析:http://daleburnett.com/2014/01/everything-ever-wanted-know-set-nocount/
发布于 2012-10-14 16:20:26
设置NOCOUNT的示例:

设置NOCOUNT OFF的示例:

发布于 2009-09-27 14:56:24
我想在某种程度上这是DBA和开发人员之间的问题。
作为一个开发人员,我想说的是,除非绝对必须使用它,否则不要使用它--因为使用它会破坏您的ADO.NET代码(正如微软所记录的)。
我想作为一个DBA,你会更多地站在另一边--尽可能地使用它,除非你真的必须阻止它的使用。
另外,如果您的开发人员使用ADO.NET的ExecuteNonQuery方法调用返回的“ExecuteNonQuery”,那么如果每个人都使用SET NOCOUNT ON,那么就会遇到麻烦,因为在这种情况下,ExecuteNonQuery总是返回0。
也可以看一下彼得·布罗姆伯格的博客帖子,看看他的位置。
因此,这实际上取决于由谁来制定标准:-)
Marc
https://stackoverflow.com/questions/1483732
复制相似问题