存储过程中是否需要“SET NOCOUNT OFF”?

时间:2011-11-21 19:13:25

标签: sql sql-server tsql nocount

我有许多程序set nocount on

是否有必要在存储过程结束时将其关闭?

e.g:

create procedure DummyProc
as
begin
    set nocount on
    ...
    set nocount off
end

4 个答案:

答案 0 :(得分:37)

set nocount on将禁用SQL返回的X rows affected.消息。在某些情况下,由于客户端执行存储过程的不良影响,此消息被禁止。

set nocount off将撤消此抑制。但是,set nocount on是一个范围设置,默认情况下,无论如何都会在离开范围时关闭。

现在,set nocount off是否必要?不,因为执行的任何新命令都在不同的范围内,默认情况下set nocount off始终有效。但正如上面的评论中所述,它被认为是一种很好的做法,只是为了明确指出当proc完成执行时此设置将恢复正常。

答案 1 :(得分:5)

我知道这是一个相当古老的帖子,但是当我寻找答案时,这是谷歌的第一次打击。上面的反应来测试它是一个非常好的主意。

我对此进行了测试,并希望更新上述内容以及其他一些细节。

使用SET NOCOUNT ON创建的范围将流​​向您的过程调用的任何过程。因此,如果您的过程设置了SET NOCOUNT,然后调用了一个sproc,那么该sproc将获得您的SET NOCOUNT设置。退出sproc时,设置会消失,但设置会向下流入被调用的sprocs。如果在CALLED sproc内部设置了NOCOUNT,则外部sproc将具有它设置的SET NOCOUNT,而内部sproc不会影响外部sproc。

所以我认为你真的不需要在你的sproc结束时重置它,因为你的设置永远不会从你的sproc向上流出;但是,如果您的sproc依赖于设置,它应该在它需要之前设置它,因为如果从另一个sproc调用它,它可能有不同的设置。

答案 2 :(得分:4)

只有你不想看到

(1 row(s) affected) // or n rows....

大部分时间 - 调试时

并且你使用打印命令 - 所以你想看到你自己的纯文本......所以这是一个很好的做法。

修改

它不会影响您的查询结果(开启或关闭 - 无关紧要。) - 如果这就是您的要求。 (感谢JNK)。

答案 3 :(得分:1)

很简单。如果另一个程序正在运行您的程序,则不需要它。 假设我的 python 代码正在调用一个 mssql 过程,那么我的应用程序不需要受影响的行数,所以我“应该”肯定在我的代码中放置“set nocount on”