2011-05-04 53 views
1

我有以下存储过程:SET NOCOUNT ON在SQL Server Management Studio中带回的消息

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) 

这仍然是一条消息。我们的一个数据库管理员说,这会是这样的,但是当它通过应用程序运行它不会返回任何消息。有没有办法,我可以测试一下,看看邮件是否被退回或没有时,我使用SET NOCOUNT ON;我不想承担,我想知道的一种方式。

我右键点击存储过程,并选择执行存储过程......然后,我将它设置为OFF,和我:

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

所以将其设置为ON或OFF仍带回的消息结果面板中的消息选项卡。

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

+0

对不起,我可能是一个愚蠢的问题,我只想澄清:您运行存储过程本身('EXEC spTitle_GetTitleById')或'ALTER PROCEDURE'声明? – Quassnoi 2011-05-04 13:37:36

+0

'SET NOCOUNT ON'复位当程序退出,它会调用堆栈。存储过程调用的任何一方是否还有其他语句? – 2011-05-04 13:39:10

+0

@Quassnoi:不是一个愚蠢的问题。我右键单击它并选择执行存储过程。 – 2011-05-04 16:45:07

回答

3

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

+0

是的,你是对的。我测试了它,并且我将上面的SELECT部分​​注释掉了,它只是返回'Command(s)successfully completed。'。这是不是一个消息? – 2011-05-04 17:02:31

+0

'set nocount on' [仅限文档](http://msdn.microsoft.com/zh-cn/library/ms189837.aspx)as“停止显示受Transact影响的行数的消息-SQL语句或存储过程作为结果集的一部分返回。“它不会停止所有消息。 – 2011-05-04 17:05:08

1

这是不正确的,剧本出PROC一个确保它不是OFF代替邻ON,如果它在它不应该返回

而且你是如何执行(1行(S)的影响)消息在PROC

是就是这个

exec spTitle_GetTitleById 1 
2

又一个问题的是非曲直一些讨论,什么时候会是明智的(在什么情况下)使用SET NOCOUNT OFF

What are the advantages and disadvantages of turning NOCOUNT off in SQL Server queries?对于转向SET NOCOUNT ON

至于为什么你想关闭这个功能(以便返回rowcounts)的好处 - 你需要这个功能,只要你希望能够告诉多少行在情况下受到影响那里没有结果集,或者您希望能够得到一个行数,而无需通过整个结果一读。

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

相关问题