42

我有很多程序set nocount on

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

例如:

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

4 回答 4

44

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

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

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

于 2011-11-21T19:29:21.697 回答
8

我知道这是一篇相当老的帖子,但当我寻找答案时,它是谷歌上的第一个热门话题。上面测试它的响应是一个非常好的主意。

我对此进行了测试,并想用一些额外的细节来更新上面的内容。

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

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

于 2016-04-14T10:32:32.777 回答
4

只有当你不想看到

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

大多数时候——当你调试时

并且您使用打印命令-因此您想查看自己的纯文本……这是一个好习惯。

编辑

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

于 2011-11-21T19:17:16.657 回答
1

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

于 2021-04-14T16:39:17.117 回答