灵感来源于this question个对布景无计数有不同看法的地方...
我们应该为SQL Server使用SET NOCOUNT ON吗?如果没有,为什么没有?
What it does编辑6,2011年7月22日
它会在任何DML之后 suppress "xx行受影响"消息.这是一个结果集,发送时,客户端必须对其进行处理.它很小,但可以测量(见下面的答案)
对于触发器等,客户端将收到多个"受影响的xx行",这会导致一些ORM、MS Access、JPA等出现各种错误(请参见下面的编辑)
Background:
一般公认的最佳实践(在提出这个问题之前我一直认为)是在SQL Server中使用SET NOCOUNT ON
in触发器和存储过程.我们在任何地方都使用它,一个快速的谷歌显示很多SQL Server MVP也同意.
MSDN说这可以打破.net SQLDataAdapter分.
对我来说,这意味着SQLDataAdapter仅限于CRUD处理,因为它希望"n行受影响"消息匹配.所以,我不能用:
- 如果存在以避免重复(没有行受影响的消息)Note: use with caution
- 不存在的地方(比预期的行少)
- 过滤掉琐碎的更新(例如没有数据实际更改)
- 之前是否进行任何表访问(如日志(log)记录)
- 隐藏复杂性或go 规范化
- 等
在问题中,marc_s(谁知道他的SQL东西)说不要使用它.这与我的 idea 不同(我认为自己在SQL方面也有一定的能力).
我可能遗漏了什么(请随意指出显而易见的),但你们这些人是怎么想的?
注意:我已经多年没有看到这个错误了,因为我现在不使用SQLDataAdapter.
Edits after comments and questions:
编辑:更多 idea ...
我们有多个客户机:一个可能使用C#SQLDataAdapter,另一个可能使用Java的nHibernate.这些可能会受到不同方式的影响.
如果将存储过程视为方法,那么假设某些内部处理以某种方式为自己的目的工作是不好的(反模式).
编辑2:trigger breaking nHibernate question,其中SET NOCOUNT ON
不能设置
(不,它不是this的复制品)
编辑3:更多信息,感谢我的MVP同事
- KB 240882,在SQL 2000及更早版本上导致断开连接的问题
- Demo of performance gain
编辑4:2011年5月13日
Breaks Linq 2 SQL too when not specified?
编辑5:2011年6月14日
断开JPA,存储进程,表变量:Does JPA 2.0 support SQL Server table variables?
编辑6:2011年8月15日
SSMS"编辑行"数据网格要求将NOCOUNT设置为:Update trigger with GROUP BY
编辑7:2013年3月7日
More in depth details from @RemusRusanu:
Does SET NOCOUNT ON really make that much of a performance difference