iT邦幫忙

DAY 12
5

MS SQL Server新特性探險:探險代碼 Denali系列 第 12

[Denali 新特性探險新特性探險12]Throw Statement

這篇介紹 Throw Statement
透過Throw Statement 你將發現原來catch runtime exception 是那麼的簡單且方便,
Throw Statement可說大大改善了以往 Error Handling 資訊不完全的詬病,
下面我將帶你體驗出SQL2005/2008 和 Denali 兩者明顯優劣。

我個人覺得有兩大優點:
優點1:標示出最原始錯誤行數。
優點2:寫法更簡便且單純。

Using RAISERROR and Print(SQL2005/2008)

begin tran mytran		
begin try    		
declare @money varchar(100);		
select 1/0;
commit tran mytran  		
end try
begin catch
--回復交易
rollback tran mytran;
--回傳自訂錯誤訊息
RAISERROR ('除法運算錯誤',16,1) 
--回傳參考它的CATCH 區塊範圍特定的錯誤訊息(寫法有點麻煩)
print ERROR_NUMBER()+ ERROR_SEVERITY()+ERROR_STATE()+ERROR_PROCEDURE()+ERROR_LINE()+ERROR_MESSAGE();
end catch	


從錯誤訊息我們只知道除以零的錯誤(因為轉換資料類型 int 失敗),
但錯誤行數卻無法讓我們立刻知道最原始的錯誤發生在那一行(原始的錯誤行數如下圖)。

Using Throw(Denali)

begin tran mytran		
begin try    		
declare @money varchar(100);		
select 1/0;
commit tran mytran  		
end try
begin catch
--回復交易
rollback tran mytran;
--Using Throw
Throw 
end catch	


在錯誤訊息上你可以看到原始的錯誤行數,使用滑鼠點兩下便會Highlight錯誤行數,
如果你的SP、TSQL寫了幾百行、千行,那你一定會很感動 Throw 怎麼那麼貼心。

回傳自訂組合錯誤訊息

注意:這裡雖使用 throw ,但無法標示出原始的錯誤行數。

可以透過 sys.messages 查看 5008 內建的錯誤訊息。

select * from sys.messages where language_id =1028and message_id =5008 

MS SQL Server新特性探險:探險代碼 Denali 全系列文章


上一篇
[Denali 新特性探險11]Metadata Discovery
下一篇
[Denali 新特性探險13]FileTables(1)
系列文
MS SQL Server新特性探險:探險代碼 Denali30

尚未有邦友留言

立即登入留言