我有许多程序set nocount on
。
是否有必要在存储过程结束时将其关闭?
e.g:
create procedure DummyProc
as
begin
set nocount on
...
set nocount off
end
答案 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”