2009-06-15 58 views
16

我在Sql Server 2008數據庫中創建一個存儲過程。我想返回受影響的行數。哪一個更好的選擇SET NOCOUNT OFF或RETURN @@ ROWCOUNT?SET NOCOUNT OFF或RETURN @@ ROWCOUNT?

ALTER PROCEDURE [dbo].[MembersActivateAccount] 
    @MemberId uniqueidentifier 
AS 
BEGIN 
    -- Should I use this? 
    SET NOCOUNT OFF; 

    UPDATE [dbo].Members SET accountActive = 1 WHERE id = @MemberId; 
    --Or should I SET NOCOUNT ON and use the following line instead? 
    --return @@ROWCOUNT; 
END 

我知道這兩個工作,但哪一個是更好的選擇,爲什麼?


經過一番嘗試,我得出的結論是SET NOCOUNT在默認情況下在存儲過程中是關閉的。是否有可能改變我的數據庫內的這種行爲?

回答

23

使用@@ RowCount。它明確且透明,完全由代碼控制,而不是內置行爲。

NOCOUNT選項可手動設置爲ON(Optons> Query Execution> SQL Server> Advanced)。如果以這種方式設置,但在存儲過程中聲明SET NOCOUNT OFF,則該本地設置優先。

4

我知道SET NOCOUNT ON會讓DataAdapter認爲存在併發衝突。您可以使用read about it on MSDN。如果代碼將被DataAdapter使用,那麼顯然不要使用SET NOCOUNT ON。

它看起來像SqlCommand also has this behaviour,我猜是DataAdapter有問題(因爲它下面會使用Command對象)的原因。

+0

我沒有在SqlCommand文檔中看到有關SET NOCOUNT的任何提及。你確定存在與DataAdapter相同的問題嗎? – niaher 2009-06-15 11:52:57

+1

谷歌它 - 你會發現它有很多證據:http://www.google.co.uk/search?client=firefox-a&rls=org.mozilla%3Aen-GB%3Aofficial&channel=s&hl=en&q=ExecuteNonQuery+ NOCOUNT&元= btnG =谷歌+搜索。我無法確定它與DataAdapter沒有經過測試的問題相同,但我不明白爲什麼會有其他原因。 – RichardOD 2009-06-15 12:00:00

5

不要對值使用RETURN。按照約定從存儲過程返回的是錯誤代碼,0表示沒有錯誤,非0表示某種問題。如果需要返回數據,則使用OUTPUT參數進行此操作的適當方式。基於其他語言對回報的使用,這有點違反直覺。

2

原因使用SET NOCOUNT ON/OFF:

爲了控制堆棧溢出,同時將行插入的任何表。 在執行查詢或嵌套查詢時傳遞T-Sql消息。 顯示或查看執行的最新查詢。 獲取有關最新記錄升級的信息。

0

爲什麼我們使用開/關---

答SET NOCOUNT:我們可以通過以下步驟

第1步明白這一點:執行查詢 「選擇頂層10 * from表名」 。

步驟2:打開消息窗口,顯示消息「10 rows affected」。它會產生額外的開銷並延長我們的執行時間。

第3步:爲了克服這個額外的開銷,我們使用SET NOCOUNT ON。如果它是On,那麼它將永遠不會計算行返回的數量,而是播放一條消息命令成功完成。

步驟4:默認情況下,NOCOUNT爲ON,那麼它會計算返回的行數,這就是爲什麼我建議在創建新過程期間應該關閉它以便從數據庫服務器獲得更好性能。

相關問題