SQL Server中的NOCOUNT - 我为什么要使用它?

时间:2014-03-09 12:21:34

标签: sql-server-2008

当我在SQL Server 2008中编写过程时,它总是写SET NOCOUNT ON

我用谷歌搜索它,看到它用于抑制xx row were effected消息,但我为什么要这样做呢?

是出于安全原因吗?

编辑:好的,所以我从目前的答案中了解到,它主要用于提高性能,以及与客户计数的一致性......

那么有理由不使用它吗?就像我希望我的客户能够将他的数量与我的数量进行比较一样?

3 个答案:

答案 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 usage

取自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