2016-11-28 26 views
4

這些答案(12),使用代碼this article,建議使用語句SET NOCOUNT ON作爲臨時佔位符/假體的屍體將很快覆蓋的存儲過程。對於佔位符存儲過程體來說,「SET NOCOUNT ON」是一個不錯的選擇嗎?

這些答案和該文章都沒有指定爲什麼選擇SET NOCOUNT ON作爲臨時存儲過程主體的值。

我的問題:爲什麼SET NOCOUNT ON是一個臨時存儲過程體的一個不錯的選擇,它將(如果一切順利)在後續操作中被覆蓋?有更好的選擇嗎?

浮現在腦海中的東西可能會構成一個良好的臨時/佔位存儲過程中身體的一些標準:

  • 以明顯的方式在運行時失敗,如果由於某種原因存儲過程的後續ALTER不按計劃發生;
  • 維護存儲過程的未來開發者很容易理解;
  • 不會增加任何重大開銷。

回答

4

爲了更好地符合我的問題的「標準」,我已着手用RAISEERROR聲明替換SET NOCOUNT ON

我的代碼,以確保存儲過程在其上運行的ALTER PROCEDURE之前存在最終看起來像:

-- Create the sproc with a temporary body if it doesn't exist yet. 
-- We'll set the real body in the ALTER PROCEDURE statement below. 
IF NOT EXISTS (
    SELECT * FROM sys.objects 
    WHERE name = 'MyStoredProcedureNameHere' 
    AND type = 'P' 
) BEGIN 
    EXEC ('CREATE PROCEDURE MyStoredProcedureNameHere AS 
    RAISERROR (''The ALTER PROCEDURE to set the body for MyStoredProcedureNameHere did not run as it should have!'', 16, 1);'); 
END 
GO 

ALTER PROCEDURE MyStoredProcedureNameHere AS ... 

所以,如果ALTER PROCEDURE莫名其妙地失敗,如果我的存儲過程被執行來運行的話,會產生一個錯誤,而不是默默無聞(如僅僅由SET NOCOUNT ON組成的實體那樣)。

信用這種方法:

+2

這是常見的,當你讓存儲過程貝殼要確保沒有人認爲他們完成提出一個「沒有實現」的錯誤。 – RBarryYoung

+0

是的,這是我試圖採取的方法! –

5

這可能是因爲包括SET NOCOUNT ON;considered good practice。它包含在由SSMS生成的模板SP中。從上NOCOUNT MSDN文章:

NOCOUNT ON防止DONE_IN_PROC消息在存儲過程中發送到客戶端 每個語句。對於 包含多個不返回太多實際數據的語句的存儲過程,或者對於包含Transact-SQL循環的 過程,將SET NOCOUNT設置爲ON 可以顯着提高性能,因爲網絡流量 大大減少。

想法是NOCOUNT是第一次使用佔位符。稍後,您將添加,而不是替換此語句。

相關問題