【问题标题】:SET NOCOUNT ON brings back messages in SQL Server Management StudioSET NOCOUNT ON 在 SQL Server Management Studio 中恢复消息
【发布时间】:2011-05-04 13:32:55
【问题描述】:

我有以下存储过程:

ALTER PROCEDURE [dbo].[spTitle_GetTitleById]
(
   @TitleId INT
)

AS

BEGIN

   SET NOCOUNT ON;

   SELECT
      Id,
      Name,
      Active
   FROM
      Title
   WHERE
      Id = @TitleId

END

如果我不想返回消息,有人告诉我使用SET NOCOUNT ON;。我通过 SQL Server Management Studio 2008 运行此存储过程,并收到以下消息:

(1 row(s) affected)

这仍然是一条消息。我们的一位 DBA 说会出现这种情况,但是当它通过应用程序运行时,它不会返回任何消息。当我使用SET NOCOUNT ON; 时,有没有一种方法可以测试是否返回了消息?我不想假设,我想知道。

我右键单击存储过程并选择执行存储过程...然后将其设置为OFF,然后我得到:

(1 row(s) affected)
(1 row(s) affected)

因此将其设置为 ON 或 OFF 它仍然会在结果面板的“消息”选项卡中返回消息。

还有一个问题,什么时候(在什么情况下)使用SET NOCOUNT OFF; 是明智的?

【问题讨论】:

  • 抱歉问了一个可能很愚蠢的问题,只是为了澄清一下:您运行的是存储过程本身 (EXEC spTitle_GetTitleById) 还是 ALTER PROCEDURE 语句?
  • SET NOCOUNT ON 在过程退出时被重置并且它在调用堆栈中上升。存储过程调用的任何一方是否还有其他语句?
  • @Quassnoi:这不是一个愚蠢的问题。我右键单击它并选择执行存储过程。
  • @Martin:不,它只是这个单一的存储过程。我右键单击它并选择执行存储过程。
  • 但这会根据我的回答生成脚本。该消息来自SELECT 'Return Value' 语句。

标签: sql-server database sql-server-2005 sql-server-2008


【解决方案1】:

SET NOCOUNT ON 在过程退出并向上调用堆栈时重置。当您从 SSMS 执行该过程时,它会生成如下脚本。

DECLARE @return_value int

EXEC    @return_value = [dbo].[spTitle_GetTitleById]
        @TitleId = 1

SELECT  'Return Value' = @return_value  /*Message comes from here*/

如果您出于某种原因想避免这种情况,您需要在外部批次中使用SET NOCOUNT ON。请参阅SET NOCOUNT ON usage,了解有关拥有此ONOFF 优点的一些讨论

【讨论】:

  • 是的,你是对的。我对其进行了测试,并注释掉了上面的 SELECT 部分,它只返回了“命令已成功完成。”。这不被视为消息吗?
  • set nocount on is only documented as “停止显示受 Transact-SQL 语句或存储过程影响的行数作为结果集的一部分返回的消息。”它不会停止所有消息。
【解决方案2】:

还有一个问题,什么时候(在什么情况下)使用SET NOCOUNT OFF 是明智的?

SET NOCOUNT ON的好处请见What are the advantages and disadvantages of turning NOCOUNT off in SQL Server queries?

至于您为什么要关闭它(以便返回行数) - 只要您想知道在没有结果集的情况下有多少行受到影响,或者您希望无需先读取整个结果集即可获得行数。

例如,在 .Net 中,DataAdapter 类使用行数,因此设置 NOCOUNT ON 会在编辑或删除数据时出现问题 (source)。

【讨论】:

    【解决方案3】:

    这是不正确的,编写 proc 并确保它不是 OFF 而不是 o ON,如果它是 ON,则不应返回(1 行受影响)消息

    还有你是如何执行过程的

    就是这样

    exec spTitle_GetTitleById 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 2011-10-10
      • 2015-06-23
      • 2012-05-30
      • 2013-07-23
      • 1970-01-01
      相关资源
      最近更新 更多