在較早的 SQL 版本,要檢測 TSQL 是否有發生執行錯誤,都只能透過判斷 @@ERROR 全域變數,直到 SQL2005 才新增了 TRY...CATCH 這個結構化的例外處理功能。 它採用和程式語言中的 TRY...CATCH 類似的語法,在 TRY 區塊內放的是一般陳述式,CATCH 區塊內放的是錯誤處理的陳述式。
使用 TRY...CATCH 結構,若執行的 TSQL 發生了錯誤,錯誤訊息將不會傳到呼叫端,除非透過 RAISERROR 再送出錯誤訊息。
取得錯誤訊息的函式:
當使用 TRY...CATCH 時,你可以在 CATCH 區塊中使用以下函式以取得與錯誤訊息相關的資訊:
ERROR_NUMBER :發生錯誤的錯誤代碼
ERROR_MESSAGE :發生錯誤的錯誤訊息
ERROR_SEVERITY :發生錯誤的錯誤層級
ERROR_STATE :發生錯誤的錯誤狀態
ERROR_PROCEDURE :發生錯誤的程序名稱
ERROR_LINE :發生錯誤的行數
BEGIN TRY
INSERT Emp(EmpName, DepNo) Values (@EmpName, 1)
INSERT Emp(EmpName, DepNo) Values (@EmpName, 1)
END TRY
BEGIN CATCH
PRINT '錯誤代碼:' + cast(ERROR_NUMBER() as varchar(5)) + char(13) +
'錯誤訊息:' + ERROR_MESSAGE()
RAISERROR('資料寫入錯誤',16,10)
END CATCH;
以上函式,若不是在 CATCH 區塊中使用,都將回傳 NULL 。