灵感来自这个问题 https://stackoverflow.com/questions/1483383/is-this-stored-procedure-thread-safe-or-whatever-the-equiv-is-on-sql-server对 SET NOCOUNT 有不同的看法...
我们应该对 SQL Server 使用 SET NOCOUNT ON 吗?如果没有,为什么不呢?
它能做什么编辑 6,2011 年 7 月 22 日
它会在任何 DML 后抑制“受影响的 xx 行”消息。这是一个结果集,发送后,客户端必须处理它。它很小,但可以测量(见下面的答案)
对于触发器等,客户端将收到多个“受影响的 xx 行”,这会导致某些 ORM、MS Access、JPA 等出现各种错误(请参阅下面的编辑)
背景:
一般接受的最佳实践(我认为直到这个问题)是使用SET NOCOUNT ON
SQL Server 中的触发器和存储过程。我们在任何地方都使用它,快速谷歌一下就会发现很多 SQL Server MVP 也同意这一点。
MSDN 说这可能会破坏.net SQL数据适配器 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.aspx.
现在,这对我来说意味着 SQLDataAdapter 仅限于完全简单的 CRUD 处理,因为它期望“n 行受影响”消息匹配。所以,我不能使用:
- IF EXISTS 以避免重复(没有行受影响的消息)注意:谨慎使用
- WHERE NOT EXISTS(行数少于预期
- 过滤掉琐碎的更新(例如没有数据实际改变)
- 之前进行任何表访问(例如日志记录)
- 隐藏复杂性或非规范化
- etc
在问题中,marc_s(谁知道他的 SQL 东西)说不要使用它。这与我的想法不同(我认为自己在 SQL 方面也有一定的能力)。
我可能遗漏了一些东西(请随意指出明显的地方),但是你们觉得呢?
注意:自从我看到这个错误以来已经很多年了,因为我现在不使用 SQLDataAdapter。
评论和问题后的编辑:
编辑:更多想法...
我们有多个客户端:一个可能使用 C# SQLDataAdaptor,另一个可能使用 Java 中的 nHibernate。这些可以通过不同的方式受到影响SET NOCOUNT ON
.
如果您将存储过程视为方法,那么假设某些内部处理按照您自己的目的以某种方式工作是不好的形式(反模式)。
编辑2:a触发破坏 nHibernate 问题 https://stackoverflow.com/questions/1354362, where SET NOCOUNT ON
无法设置
(不,它不是重复的this https://stackoverflow.com/questions/995589/set-nocount-off-or-return-rowcount)
编辑 3:更多信息,感谢我的 MVP 同事
-
,导致 SQL 2000 及更早版本上断开连接的问题
-
性能增益演示 http://sqlmag.com/sql-server-2000/seeing-believing
编辑 4:2011 年 5 月 13 日
未指定时也会中断 Linq 2 SQL? https://stackoverflow.com/q/5880413/27535
编辑 5:2011 年 6 月 14 日
使用表变量破坏 JPA、存储过程:JPA 2.0 是否支持 SQL Server 表变量? https://stackoverflow.com/q/6344631/27535
编辑 6:2011 年 8 月 15 日
SSMS“编辑行”数据网格需要 SET NOCOUNT ON:使用 GROUP BY 更新触发器 https://stackoverflow.com/q/7067329/27535
编辑 7: 2013 年 3 月 7 日
来自 @RemusRusanu 的更多深入细节:
SET NOCOUNT ON 真的能带来那么大的性能差异吗 https://stackoverflow.com/questions/1915405/does-set-nocount-on-really-make-that-much-of-a-performance-difference/1918085#1918085