TSQL TRY/CATCH Statement – 在TSQL 上使用 TRY/CATCH Statement

原來TSQL 也有Try and Catch Block
今天需要升級同事的一個程式..
由於這個同事已經不在公司..
而我們又沒有信心我們的更新的SQL Query 不會出錯
[因為數據是Third Party Provider給我們的…
不知道他們的數據會不會Break我們的TSQL]
所以便做了一些Research 看看有沒有一些安全方法..
可以當SQL Statement 出現錯誤時..
這個Stored Procedure 會自動把錯誤信息加進另一個Table上.
我們只需要檢查這個Table便可以知道我們的SQL Statement / Stored Procedure有沒有出錯了

做完Research 之後發現原來我們可以在TSQL 上使用 Try and Catch Statment
E.G.

BEGIN TRY
 -- SQL Statement
END TRY
BEGIN CATCH
		
	-- 顯示錯誤信息.. 在其他Programming 一樣
	 SELECT
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;
        
END CATCH

擷取錯誤資訊
CATCH 區塊的範圍內,下列系統函數可用來取得造成執行 CATCH 區塊之錯誤的相關資訊:

  • ERROR_NUMBER() 會傳回錯誤碼。
  • ERROR_SEVERITY() 會傳回嚴重性。
  • ERROR_STATE() 會傳回錯誤狀態碼。
  • ERROR_PROCEDURE() 會傳回發生錯誤的預存程序或觸發程序的名稱。
  • ERROR_LINE() 會傳回常式內造成錯誤的行號。
  • ERROR_MESSAGE() 會傳回錯誤訊息的完整文字。 文字包括提供給任何可替代參數的值,例如,長度、物件名稱或次數。
  • 如果是在 CATCH 區塊範圍之外呼叫這些函數,它們會傳回 NULL。 這些函數可以從 CATCH 區塊範圍內的任何位置擷取錯誤資訊。 例如,下列指令碼顯示包含錯誤處理函數的預存程序。 在 TRYCATCH建構的 CATCH區塊中,會呼叫預存程序,並傳回錯誤的相關資訊。

Catch Statement 示範:

DECLARE @TestSQL VARCHAR(100) ='Try'

BEGIN TRY
-- Try to add String and number together
SELECT @TestSQL+ 99

	--  if it passed the try statement, update the TestSQL variable
	SET @TestSQL = 'Passed Try Statement'
END TRY
BEGIN CATCH
	SET @TestSQL = 'Fall into Catch Statement'
	
	-- Show Error Information, when it fall into catch statement
	 SELECT
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;
        
END CATCH

-- Output 
SELECt @TestSQL

執行結果:
TSQL Try and Catch -> Catch Result

Try Statement 示範:

DECLARE @TestSQL VARCHAR(100) ='Try'

BEGIN TRY
-- Try to add String and number together
SELECT @TestSQL+ 99

	--  if it passed the try statement, update the TestSQL variable
	SET @TestSQL = 'Passed Try Statement'
END TRY
BEGIN CATCH
	SET @TestSQL = 'Fall into Catch Statement'
	
	-- Show Error Information, when it fall into catch statement
	 SELECT
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;
        
END CATCH

-- Output 
SELECt @TestSQL

執行結果:
TSQL Try and Catch Statement Success

詳情可以參考以下網址
http://technet.microsoft.com/zh-tw/library/ms175976.aspx

Hope you find it useful

Leave a Reply