相关疑难解决方法(0)

设置NOCOUNT ON使用情况

灵感来自这个问题,对于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 SQLDataAdapter.

现在,这对我来说意味着SQLDataAdapter仅限于完全简单的CRUD处理,因为它希望"n行受影响"消息匹配.所以,我不能用:

  • 如果EXISTS避免重复(没有行影响消息)注意:请谨慎使用
  • 什么不存在(预期行数较少)
  • 过滤掉琐碎的更新(例如,没有数据实际更改)
  • 之前进行任何表访问(例如记录)
  • 隐藏复杂性或denormlisation
  • 等等

在问题marc_s(谁知道他的SQL的东西)说不要使用它.这与我的想法不同(我认为自己在SQL方面也有一定的能力).

有可能我错过了一些东西(随意指出明显的东西),但你们有什么想法呢?

注意:我看到这个错误已经好几年了,因为我现在不使用SQLDataAdapter.

在评论和问题后编辑:

编辑:更多想法......

我们有多个客户端:一个可以使用C#SQLDataAdaptor,另一个可以使用Java中的nHibernate.这些可能会以不同的方式受到影响SET NOCOUNT ON.

如果您将存储过程视为方法,那么假设某些内部处理以某种方式为您自己的目的而工作则是不好的形式(反模式).

编辑2:触发器打破nHibernate问题,SET NOCOUNT ON无法设置

(不,它不是一个重复的这个)

编辑3:更多信息,感谢我的MVP同事

编辑2011年5月13日

如果没有指定,还会破解Linq 2 SQL吗?

编辑2011年6月14日

使用表变量打破JPA,存储过程:JPA 2.0是否支持SQL Server表变量?

编辑6:2011年8月15日

SSMS"编辑行"数据网格需要SET NOCOUNT ON:使用GROUP BY更新触发器

编辑2013年3月7日7:07

来自@RemusRusanu的更深入的细节:
SET NOCOUNT …

sql t-sql sql-server concurrency ado.net

320
推荐指数
7
解决办法
25万
查看次数

标签 统计

ado.net ×1

concurrency ×1

sql ×1

sql-server ×1

t-sql ×1