SQL - SQL SERVER 2012 THROW

摘要:SQL - SQL SERVER 2012 THROW

接觸 MS SQL SERVER 從 2000 到 2012,在錯誤的處理機制上,不斷的演變進化,在 2012 中加入了新的元素,throw,這個錯誤處理的機制,相較以往的寫法是既簡單又省事。以下就來呈現這好用的新元素 throw...

--範例一:簡易的用法,真是太簡易了

DECLARE @I1 DECIMAL(5,2)

BEGIN TRY
SET @I1 = 9999.99
PRINT @I1
END TRY
BEGIN CATCH
THROW;
END CATCH

結果:

 

--範例二:使用 FORMATMESSAGE 來自訂顯示錯誤的訊息
DECLARE @I2 DECIMAL(5,2)
DECLARE @MYMSG1 NVARCHAR(MAX)

BEGIN TRY
SET @I2 = 9999.99
PRINT @I2
END TRY
BEGIN CATCH
--系統錯誤訊息:轉換 numeric 到資料類型 numeric 時發生算術溢位錯誤。
--自訂錯誤訊息:在指定給變數 @I2 的值已經超過其宣告的長度 DECIMAL(5,2)
SET @MYMSG1 = FORMATMESSAGE('在指定給變數 %s 的值已經超過其宣告的長度 DECIMAL(%d,%d)', '@I2', 5, 2);
THROW 1010407, @MYMSG1, 16;
END CATCH

結果:

 

--範例三:透過 sp_addmessage 來自訂顯示的錯誤訊息
--透過 sp_addmessage 新增自訂的錯誤訊息
--注意:依據MSDN所述,自訂的錯誤訊息,一開始的 lang 必須要給 us_english,其後均可以使用其他的語言
EXEC sp_addmessage 1010407, 16, N'在指定給變數 %s 的值已經超過其宣告的長度 DECIMAL(%d,%d)', 'us_english'


 

--語言哪裡查,請至 SYS.SYSLANGUAGES 系統資料表,表中有一個欄位名叫 name 的,就是我們要的
SELECT * FROM SYS.SYSLANGUAGES

--透過 SYS.MESSAGES 系統資料表查詢所新增的錯誤訊息資料
SELECT * FROM SYS.MESSAGES WHERE MESSAGE_ID = 1010407


 

--測試
DECLARE @I3 DECIMAL(5,2)
DECLARE @MYMSG2 NVARCHAR(MAX)

BEGIN TRY
SET @I3 = 9999.99
PRINT @I3
END TRY
BEGIN CATCH
SET @MYMSG2 = FORMATMESSAGE(1010407, '@I3', 5, 2);
THROW 1010407, @MYMSG2, 16;
END CATCH


 

--刪掉自訂的 1010407 錯誤訊息
EXEC sp_dropmessage 1010407, 'ALL'


 

--查詢
SELECT * FROM SYS.MESSAGES WHERE MESSAGE_ID = 1010407



參考:
THROW (Transact-SQL)
FORMATMESSAGE (Transact-SQL)
sys.messages (Transact-SQL)
sp_addmessage (Transact-SQL)
sp_dropmessage (Transact-SQL)
RAISERROR (Transact-SQL)
使用 @@ERROR
在 Transact-SQL 中使用 TRY...CATCH