Sql server 在SQL Server Management Studio中将NOCOUNT设置为打开会带回消息

Sql server 在SQL Server Management Studio中将NOCOUNT设置为打开会带回消息,sql-server,database,sql-server-2005,sql-server-2008,Sql Server,Database,Sql Server 2005,Sql Server 2008,我有以下存储过程: ALTER PROCEDURE [dbo].[spTitle_GetTitleById] ( @TitleId INT ) AS BEGIN SET NOCOUNT ON; SELECT Id, Name, Active FROM Title WHERE Id = @TitleId END 我被告知使用设置NOCOUNT ON如果我不想返回消息。我通过SQL Server M

我有以下存储过程:

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

AS

BEGIN

   SET NOCOUNT ON;

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

END
我被告知使用
设置NOCOUNT ON如果我不想返回消息。我通过SQL Server Management Studio 2008运行了此存储过程,并收到以下消息:

(1 row(s) affected)
这仍然是一条信息。我们的一位DBA说情况会是这样,但是当它在应用程序中运行时,它不会返回任何消息。当我使用
SET NOCOUNT ON时,是否有一种方法可以测试消息是否返回我不想假设,我想知道

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

(1 row(s) affected)
(1 row(s) affected)
因此,将其设置为“开”或“关”,仍会在“结果”面板的“消息”选项卡中返回消息


还有一个问题,什么时候(在什么情况下)明智地使用
设置NOCOUNT OFF

如果不正确,请编写程序脚本,并确保它没有关闭而不是打开,如果打开,则不应返回(受影响的1行)消息

你是如何执行这个过程的

就是这样吗

exec spTitle_GetTitleById 1

这是不正确的,请将程序脚本化,并确保它没有关闭而不是打开,如果它打开,则不应返回(受影响的1行)消息

你是如何执行这个过程的

就是这样吗

exec spTitle_GetTitleById 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*/

如果您出于某种原因想要避免这种情况,您需要在外部批处理中
设置NOCOUNT ON
。有关打开或关闭此
的优点的一些讨论,请参见。当过程退出并上升到调用堆栈时,不会重置打开的计数。当您从SSMS执行该过程时,它会生成如下脚本

DECLARE @return_value int

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

SELECT  'Return Value' = @return_value  /*Message comes from here*/
如果您出于某种原因想要避免这种情况,您需要在外部批处理中
设置NOCOUNT ON
。有关此
打开
关闭的优点的讨论,请参阅

还有一个问题,什么时候(在什么情况下)使用
设置NOCOUNT OFF

请参阅,了解打开“无计数”的好处

至于为什么要关闭此选项(以便返回行数)-当您想知道在没有结果集的情况下有多少行受到影响,或者希望在不首先读取整个结果集的情况下获得行数时,需要关闭此选项

例如,在.Net中,
DataAdapter
类使用行计数,因此在编辑或删除数据时设置
NOCOUNT会导致问题()

还有一个问题,什么时候(在什么情况下)使用
设置NOCOUNT OFF

请参阅,了解打开“无计数”的好处

至于为什么要关闭此选项(以便返回行数)-当您想知道在没有结果集的情况下有多少行受到影响,或者希望在不首先读取整个结果集的情况下获得行数时,需要关闭此选项


例如,在.Net中,
DataAdapter
类使用行计数,因此在编辑或删除数据时设置
NOCOUNT会导致问题()

很抱歉问了一个可能很愚蠢的问题,请澄清一下:您运行了存储过程本身(
EXEC-spTitle\u GetTitleById
),或者
ALTER-procedure
语句?
SET-NOCOUNT-ON
在过程退出并进入调用堆栈时被重置。在存储过程调用的两边是否还有其他语句?@Quassnoi:这不是一个愚蠢的问题。我右键单击它并选择执行存储过程。@Martin:不,它只是一个存储过程。我右键单击它并选择执行存储过程。但这会根据我的回答生成脚本。消息来自
SELECT'Return Value'
语句。对于一个可能愚蠢的问题,请澄清:您运行了存储过程本身(
EXEC-spTitle\u GetTitleById
),或者
ALTER-procedure
语句?
SET-NOCOUNT-ON
在过程退出并进入调用堆栈时被重置。在存储过程调用的两边是否还有其他语句?@Quassnoi:这不是一个愚蠢的问题。我右键单击它并选择执行存储过程。@Martin:不,它只是一个存储过程。我右键单击它并选择执行存储过程。但这会根据我的回答生成脚本。消息来自
选择“返回值”
语句。是的,您是正确的。我对它进行了测试,并注释掉了上面的SELECT部分,它只返回了“Command(s)completed successfully”。这不被视为消息吗?
将nocount on
设置为“阻止显示受Transact-SQL语句或存储过程影响的行数的消息作为结果集的一部分返回”。它不会停止所有消息。是的,您是正确的。我对它进行了测试,并注释掉了上面的SELECT部分,它只返回了“Command(s)completed successfully”。这不被视为消息吗?
将nocount on
设置为“停止显示受Transact-SQL语句或存储过程影响的行数的消息作为结果集的一部分返回”。它不会停止所有消息。