受这个问题对于设置NOCOUNT有不同的意见.。
我们是否应该将SET NOCOUNT用于SQLServer?若否,原因为何?
它所做的编辑6,2011年7月22日
它会在任何DML之后取消“xx行受影响”消息。这是一个结果集,当发送时,客户端必须处理它。它很小,但是可以测量(见下面的答案)
对于触发器等,客户端将接收多个受影响的“xx行”,这会导致一些ORM、MS Access、JPA等方面的各种错误(参见下面的编辑)。
背景:
一般公认的最佳实践(我认为在这个问题之前)是使用SET NOCOUNT ON
在SQLServer中的触发器和存储过程中。我们在任何地方都使用它,一个快速的Google显示了大量的SQLServerMVP也表示同意。
MSDN说这会破坏.NET SQLDataAdapter.
现在,这意味着SQLDataAdapter仅限于完全简单的CRUD处理,因为它期望“n行受影响”消息匹配。所以,我不能用:
- 如果存在以避免重复(没有行影响消息)
注:谨慎使用
- 不存在的地方(比预期的行少)
- 过滤掉琐碎的更新(如没有数据实际更改)
- 之前是否进行任何表访问(例如日志记录)
- 隐藏复杂性或非正态化
- 等
在问题中,MARC_s(谁知道他的SQL内容)说不要使用它。这与我所认为的不同(我也认为自己在SQL方面有一定的能力)。
也许我遗漏了一些东西(随便指出一些显而易见的事情),但是你们认为呢?
注意:由于现在不使用SQLDataAdapter,我已经多年没有看到这个错误了。
在评论和问题之后编辑:
编辑:更多的想法.。
我们有多个客户端:一个可以使用C#SQLDataAdaptor,另一个可以使用Java的nHibernate。可以不同的方式影响这些SET NOCOUNT ON
.
如果您将存储过程视为方法,那么假设某些内部处理为您自己的目的以某种方式工作是不好的形式(反模式)。
编辑2:a触发中断nHibernate问题,在哪里SET NOCOUNT ON
不能设置
(不,这不是这,这个)
编辑3:还有更多的信息,感谢我的MVP同事
编辑4:2011年5月13日
未指定时也会中断Linq 2 SQL?
编辑5:14 2011年6月14日
破坏JPA,用表变量存储proc:JPA2.0支持SQLServer表变量吗?
编辑:2011年8月15日
SSMS“编辑行”数据网格要求将NOCOUNT设置为:使用组更新触发器
编辑7:07 2013年3月
详情见@RemusRusanu:
设置NOCOUNT真的能使性能有很大的不同吗?
根据使用情况设置NOCOUNT