2011-05-04 66 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)。