我知道一些可用於確定我們自己的存儲過程是否已成功執行的方法。 (使用輸出參數,在存儲過程的末尾放置一個選擇,如果已經執行了沒有任何錯誤,...)什麼是確定我們自己的存儲過程是否已成功執行的最佳方法
那麼哪一個更好,爲什麼?
我知道一些可用於確定我們自己的存儲過程是否已成功執行的方法。 (使用輸出參數,在存儲過程的末尾放置一個選擇,如果已經執行了沒有任何錯誤,...)什麼是確定我們自己的存儲過程是否已成功執行的最佳方法
那麼哪一個更好,爲什麼?
有一個清楚地說明SP是否已創建的打印語句會更具可讀性。
例如
CREATE PROCEDURE CustOrdersDetail @OrderID int
AS
...
...
...
GO
IF OBJECT_ID('dbo.CustOrdersDetail') IS NOT NULL
PRINT '<<< CREATED PROCEDURE dbo.CustOrdersDetail >>>'
ELSE
PRINT '<<< FAILED CREATING PROCEDURE dbo.CustOrdersDetail >>>'
GO
如果您的應用程序打電話,此打印在哪裏? – msvcyc 2009-07-20 06:14:00
如果通過某種工具而不是應用程序調用多個sps的腳本,這將是有益的。如果您通過應用程序執行單個sp,請使用RETURN或SELECT而不是PRINT。 – 2009-07-20 09:34:34
使用RAISERROR在程序出錯的情況下集成了大多數客戶比使用假out參數更好。他們只是簡單地調用過程,而RAISERROR在客戶端應用程序中轉化爲異常,並且應用程序代碼很難避免異常,因此必須對其進行處理。
SP非常像一個方法/子程序/程序&他們都有一個任務要完成。該任務可以像計算&一樣簡單地返回結果,或者可以僅僅是對錶中記錄的簡單操縱。根據任務的不同,您可以返回指示任務結果的輸出值,無論它是成功,失敗還是實際結果。
如果您需要針對整個項目/數據庫的通用T-SQL解決方案,則可以使用所有過程的輸出參數。但RAISEERROR是處理客戶端代碼中的錯誤的方式,而不是T-SQL。
爲什麼不使用不同的返回值,然後可以在代碼中處理?
引入額外的輸出參數或額外的選擇是不必要的。
如果您唯一需要知道的是是否存在問題,成功的執行是足夠好的選擇。看看XACT_ABORT和TRY ... CATCH here和here的討論。
如果您想知道具體的錯誤,return code是將此信息傳遞給調用者的正確方法。
在大多數生產場景中,我傾向於在數據庫層中部署自定義錯誤報告組件,作爲解決方案的一部分。沒有什麼特別的,只有少數幾個日誌表和一些存儲過程來管理錯誤記錄過程。
然後使用SQL Server 2005及更高版本中提供的TRY-CATCH-BLOCK功能封裝在生產服務器上執行的所有存儲過程代碼。
這意味着,如果某個給定的存儲過程發生故障,發生錯誤的詳細信息以及生成它的存儲過程將記錄到日誌表中。一個簡單的存儲過程調用是從CATCH BLOCK內部進行的,以便記錄相關的細節。
此實現的基礎,在書實際上是解釋網上here
你應該願意,你可以很容易地進一步通過將電子郵件通知到DBA甚至短信提醒擴展此實現,例如可以發送依賴關於錯誤的嚴重程度。
這種類型的實現可以確保如果您的存儲過程沒有報告失敗,那當然是成功的。
一旦您擁有了一個簡單而健壯的框架,就可以直接複製並將您的基礎實施推廣到其他生產服務器/應用程序平臺。
這裏沒什麼特別的,只是簡單的錯誤日誌和報告工作。
另一方面,如果您還需要記錄存儲過程的成功執行,那麼可以設計一個類似的解決方案,其中包含日誌表。
我認爲這個問題是尖叫出來的博客帖子...... ..
存儲的過程每天執行多次,或只是一次? – fARcRY 2009-07-20 05:35:02
很多次..... – odiseh 2009-07-21 10:25:12