程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 在SQL Server2005中進行錯誤捕捉

在SQL Server2005中進行錯誤捕捉

編輯:關於SqlServer

任何程序都可能出現錯誤,在SQL Server中執行Transact-SQL也不例外。如果在Transact-SQL中發生了錯誤,一般有兩種捕捉錯誤的方法,一種是在客戶端代碼(如C#、Delphi等)中使用類似try...catch的語句進行捕捉;另外一種就是在Transact-SQL中利用Transact-SQL本身提供的錯誤捕捉機制進行捕捉。如果是因為Transact-SQL語句的執行而產生的錯誤,如鍵值沖突,使用第一種和第二種方法都可以捕捉,但是如果是邏輯錯誤,使用客戶端代碼進行捕捉就不太方便。因此,本文就如何使用Transact-SQL進行錯誤捕捉進行了討論。

一、非致命錯誤(non-fatal error)的捕捉

通過執行Transact-SQL而產生的錯誤可分為兩種:致命錯誤(fatal error)和非致命錯誤(non-fatal error)。在Transact-SQL中只可以捕捉非致命錯誤(如鍵值沖突),而無法捕捉致命錯誤(如語法錯誤)。在Transact-SQL中可以通過系統變量@@ERROR判斷最近執行的一條語句是否成功執行。如果發生了錯誤,@@Error的值大於0,否則值為0。下面舉一個例子說明@@ERROR的使用。

假設有一個表table1,在這個表中有兩個字段f1,f2。其中f1是主鍵。

insert INTO table1 VALUES(1, ’aa’)
insert INTO table1 VALUES(1, ’bb’) --這條語句將產生一個錯誤
IF @@ERROR > 0
PRINT ’鍵值沖突’

當執行第二條語句時發生鍵值沖突錯誤,@@ERROR被賦為錯誤號2627,因此輸出結果顯示’鍵值沖突’。使用@@ERROR系統變量時需要注意,@@ERROR只記錄最近一次執行的Transact-SQL語句所發生的錯誤,如果最近一次執行的Transact-SQL沒有發生錯誤,@@ERROR的值為0。因此,只能在被捕捉的那條Transact-SQL語句後使用@@ERROR。

在SQL Server中,不僅可以捕捉系統提供的錯誤,還可以自定義錯誤。有兩種方法可以定義錯誤信息。

1、使用sp_addmessage系統存儲過程添加錯誤信息,然後使用RAISERROR拋出錯誤。

sp_addmessage將錯誤號,錯誤級別、錯誤描述等信息添加到系統表中,然後使用RAISERROR根據相應的錯誤號拋出錯誤信息。用戶自定義的信息應該從50001開始。

exec sp_addmessage @msgnum = 50001, @severity = 16,
@msgtext = ’sql encounter an error(%s).’,
@lang = ’us_english’
exec sp_addmessage @msgnum = 50001, @severity = 16,
@msgtext = ’sql遇到了一個錯誤(%1!).’

如果使用的SQL Server版本是非英語版本,在添加本地錯誤信息時必須首先添加英文的錯誤信息。錯誤描述可以象c語言中的printf的格式字符串一樣使用參數,如%s、%d。但要注意的是在英文版的錯誤信息中要使用%s、%d等形式,而在本地化的錯誤信息中要使用%1!、%2!等形式,在每個%?(1 <= ? <= n)後需要加一個!,而且%?的數目必須和英文版的錯誤信息的參數一致。

在未插入本地化錯誤信息時,RAISERROR將使用英文版的錯誤信息。當插入本地化錯誤信息時,RAISERROR使用本地化的錯誤信息。

RAISERROR(50001, 16, 1, ’測試’)

輸出的結果:

服務器: 消息 50001,級別 16,狀態 1,行 1

sql遇到了一個錯誤(測試).

其中’測試’字符串通過%1傳入本地化的錯誤描述字符串中。

2、直接使用RAISERROR將錯誤拋出。

使用第一種方法雖然使Transact-SQL語句看上去更整潔(這種方法類似於在編程語言中使用常量定義錯誤信息,然後在不同的地方通過錯誤編號引用這些錯誤信息。),但是這樣做卻使錯誤信息和數據庫的耦合度增加,因為如果將這些帶有RAISERROR的Transact-SQL放到別的SQL Server數據庫上執行,由於在其它的數據庫中還未添加錯誤信息,因此會產生RAISERROR調用錯誤,除非使用sp_addmessage將所需的錯誤信息再加入到其它的數據庫中。

基於上述原因,RAISERROR不僅可以根據錯誤代碼拋出錯誤信息,也可以直接通過錯誤描述格式字符串拋出錯誤信息。

RAISERROR(’sql遇到了一個錯誤(%s)’, 16, 1, ’測試’)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved