当我在SQL Server 2008中编写过程时,它总是写SET NOCOUNT ON
。
我用谷歌搜索它,看到它用于抑制xx row were effected
消息,但我为什么要这样做呢?
是出于安全原因吗?
编辑:好的,所以我从目前的答案中了解到,它主要用于提高性能,以及与客户计数的一致性......
那么有理由不使用它吗?就像我希望我的客户能够将他的数量与我的数量进行比较一样?
答案 0 :(得分:2)
我认为SET NOCOUNT ON
主要用于避免向客户端传回潜在的误导性信息。例如,在存储过程中,您的批处理可能包含多个不同的语句,这些语句具有自己的受影响记录数,但您可能希望将一个,也许是完全不同的数字传回客户端。
答案 1 :(得分:2)
这不是为了安全,因为rowcount并没有真正泄露太多信息,特别是与同一负载中的数据相比。
如果从应用程序调用SQL,则“xxx行”将作为数据集返回到应用程序,在获取数据之前进行网络往返,如Mihai所说,可能会对性能产生影响。 / p>
最重要的是,将它添加到您的存储过程并不会有什么坏处,这是常见的做法,但您没有义务。
答案 2 :(得分:-1)
根据MSDN SET NOCOUNT ON
停止显示受影响行数的消息 通过Transact-SQL语句或存储过程返回 作为结果集的一部分。
当SET NOCOUNT为ON时,不返回计数。 SET NOCOUNT时 关闭,返回计数。 @@ ROWCOUNT函数甚至更新 当SET NOCOUNT为ON时。
关于SO的另一篇相关的好文章
取自SET NOCOUNT ON Improves SQL Server Stored Procedure Performance
SET NOCOUNT ON
关闭SQL Server发回的邮件 执行每个T-SQL语句后的客户端。执行此操作 对于所有SELECT,INSERT,UPDATE和DELETE语句。有这个 在查询窗口中运行T-SQL语句时,信息很方便, 但是当运行存储过程时,不需要这样做 要传递给客户的信息。通过从网络中删除这些额外的开销,它可以大大增加 提高数据库和应用程序的整体性能。
如果仍需要获取受T-SQL影响的行数 正在执行的语句仍然可以使用@@ ROWCOUNT选项。 通过发出SET NOCOUNT ON此功能(@@ ROWCOUNT)仍然有效 仍然可以在您的存储过程中使用来识别行数 受到声明的影响。
那么有理由不使用它吗?
如果要比较受影响的行数,请使用@@ROWCOUNT
。