灵感来源于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同事

编辑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

推荐答案

好的,现在我已经做了研究,下面是交易:

在TDS协议中,SET NOCOUNT ON只保存了9-bytes per query个字节,而文本"SET NOCOUNT ON"本身就有14个字节.我以前认为123 row(s) affected是在一个单独的网络数据包中以明文形式从服务器返回的,但事实并非如此.它实际上是一个叫做DONE_IN_PROC的小 struct 嵌入到响应中.它不是单独的网络数据包,因此不会浪费往返时间.

我认为你可以坚持默认的计数行为,而不用担心性能.不过,在某些情况下,预先计算行数会影响性能,例如只向前移动光标.在这种情况下,可能不需要计算.除此之外,绝对没有必要遵循"尽可能使用NOCOUNT"的座右铭.

下面是一个非常详细的分析,关于SET NOCOUNT设置的重要性:http://daleburnett.com/2014/01/everything-ever-wanted-know-set-nocount/

Sql相关问答推荐

GROUP BY与多个嵌套查询T—SQL

SQL(PostgreSQL)从条件创建点表

如果开始期间不存在PostgresSql回填数据

Lag()函数的差异:R与SQL(将R代码转换为SQL)

一个SQL查询将在需要的地方多次返回同一成员

仅在特定字符串之后提取两个圆括号之间的计量单位文本

按日期时间(不包括秒)连接表

是否可以为表中的所有列生成散列值?

如何使用SQL Server中的Nodes()方法执行与OPENXML相同的操作

属于(日期)范围类型及其交集的总权重​

对于多字节字符,SQL Server中的DATALENGTH返回1字节

比较SQL中以逗号分隔的字符串

postgres中的条件索引和触发器

SQL:使用年/月/日分区查询某个时间段的数据

在Postgres,什么是;.USSTZ;在';YYYY-MM-DD;T;HH24:MI:SS.USSTZ';?

替换SQL Server XML中多处出现的 node 值

SQL Server:时态表并在运行时添加计算列

避免在SQL中使用具有相同条件的多个子查询

SQL Server 查找存在于所有不同时期(或序列)中的条目

snowfalke 会在 Select 运行时锁定表吗?