2013-04-30 48 views
1

我試圖想出一個存儲過程中的錯誤處理模板,或者只是能夠處理99%的失敗或錯誤的一般語句。在處理TSQL腳本中的錯誤時尋找最佳實踐

在網上查看SQL事務和嘗試捕獲的不同示例後,我想出了這個模板,我想與一些同事分享,希望看看是否有人認爲我錯過了一些東西。

BEGIN TRY 
    BEGIN TRAN 
     --Place code in here. 



     --Your Code Ends Here 
    COMMIT 
END TRY 
BEGIN CATCH 
    -- There was an error 
    IF @@TRANCOUNT > 0 
    ROLLBACK --Rolls back from where error first discovered. All code after error not run. 

    -- Raise an error with the details of the exception 
    DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int 

    SELECT @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY() 
    RAISERROR(@ErrMsg, @ErrSeverity, 1) --This will be picked up by .NET Exception handler. 
END CATCH 

謝謝!

回答

1

根據proc的作用,在記錄表中存儲更多關於錯誤的數據有時是很好的做法。例如,您可能不僅要存儲錯誤消息,而且還要存儲發送到proc的參數,以便您可以排除故障,確切瞭解哪些數據導致了問題。如果我們經常爲複雜插入操作執行多個步驟,則可能需要存儲錯誤發生時的步驟信息,因爲某些錯誤消息在面對1000行處理時可能不太有用。我這樣做的方法是在開始時設置一個表變量,其中包含我要存儲在日誌記錄表中的字段。然後在我執行步驟時插入數據。我可以選擇將所有步驟存儲在表變量中,或者在運行之前使用新數據的每個步驟進行重新計算。然後,當你點擊catch塊時,用錯誤消息數據更新表變量。在回滾事務後,表變量仍然可用,因此您可以在回滾後使用該表變量插入到日誌表中。當proc很少失敗時,這對診斷問題特別有用。