SQL Server儲存過程中raiserror的使用

kitesky發表於2005-01-03
一 系統預定義錯誤程式碼

SQL Server 有3831個預定義錯誤程式碼,由master.dbo.sysmessages表維護。每一個錯誤程式碼都有相應的級別和描述。
錯誤定義的級別從0到25。20以上的錯誤代表重大錯誤,通常意味著該錯誤會導致儲存程式立刻終止,並且所有的客戶連線都要重新初始化。
非關鍵性錯誤只是禁止掉當前執行的程式行,並繼續執行。

判斷錯誤是否發生和得到錯誤描述資訊的方法:

IF @@ERROR = 0

begin

    SELECT @ERRORMESSAGETXT = description FROM master.dbo.sysmessages WHERE error = @@ERROR

end

二 raiserror語法

msg_id 定製訊息的錯誤程式碼。. RAISERROR 接受任何大於13000的數字, 但是定製資訊msg_id要大於等於50000。
msg_str 定製資訊的文字。
severity 定製資訊的級別。從 0 to 25, 19-25 是重大錯誤程式碼。
state 呈現導致錯誤的狀態,不在SQL內部使用。
argument 定義在錯誤資訊中的可以替換的值。
WITH…

有三個選項:
·     WITH LOG 紀錄錯誤。只能用於級別高於19的錯誤。
·     WITH NOWAIT 將錯誤立刻傳送到客戶端
·     WITH SETERROR sets @@ERROR to the value specified by msg_id, regardless of severity level.

 

語法
RAISERROR ( { msg_id ¦ msg_str } { , severity , state }
[ , argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]

引數
msg_id

儲存於 sysmessages 表中的使用者定義的錯誤資訊。使用者定義錯誤資訊的錯誤號應大於 50,000。由特殊訊息產生的錯誤是第 50,000 號。

msg_str

是一條特殊訊息,其格式與 C 語言中使用的 PRINTF 格式樣式相似。此錯誤資訊最多可包含 400 個字元。如果該資訊包含的字元超過 400 個,
則只能顯示前 397 個並將新增一個省略號以表示該資訊已被截斷。所有特定訊息的標準訊息 ID 是 14,000。

msg_str 支援下面的格式:

% [[flag] [width] [precision] [{h ¦ l}]] type

可在 msg_str 中使用的引數包括:

flag

用於確定使用者定義的錯誤資訊的間距和對齊的程式碼。

{h | l} type

與字元型別 d、i、o、x、X 或 u 一起使用,用於建立 short int (h) 或 long int (l) 型別的值。

字元型別表示
d 或 I帶符號的整數
o不帶符號的八進位制數
p指標型
sString
u不帶符號的整數
x 或 X不帶符號的十六進位制數

說明  不支援 float、雙精度和單精度字元型別。

severity

使用者定義的與訊息關聯的嚴重級別。使用者可以使用從 0 到 18 之間的嚴重級別。19 到 25 之間的嚴重級別只能由 sysadmin 固定伺服器角色成員使用。
若要使用 19 到 25 之間的嚴重級別,必須選擇 WITH LOG 選項。

注意 20 到 25 之間的嚴重級別被認為是致命的。如果遇到致命的嚴重級別,客戶端連線將在收到訊息後終止,並將錯誤記入錯誤日誌和應用程式日誌。


state

從 1 到 127 的任意整數,表示有關錯誤呼叫狀態的資訊。state 的負值預設為 1。

argument

是用於取代在 msg_str 中定義的變數或取代對應於 msg_id 的訊息的引數。可以有 0 或更多的替代引數;然而,替代引數的總數不能超過 20 個。
每個替代引數可以是區域性變數或這些任意資料型別:int1、int2、int4、char、varchar、binary 或 varbinary。不支援其它資料型別。

option

錯誤的自定義選項。option 可以是以下值之一:

值 描述
LOG 將錯誤記入伺服器錯誤日誌和應用程式日誌。記入伺服器錯誤日誌的錯誤目前被限定為最多 440 位元組。
NOWAIT 將訊息立即傳送給客戶端。
SETERROR 將 @@ERROR 的值設定為 msg_id 或 50000,與嚴重級別無關。

三 使用者自定義錯誤處理

IF (@role_type_id IS NULL)
  BEGIN
   RAISERROR ('Parameter ''role_type_id'' can not be null.' , 16, 1) WITH NOWAIT
   RETURN 1
  END

四 定製錯誤資訊

當然,大多數情況下,錯誤資訊會使用多次,一遍一遍的輸入相同的資訊顯然不理智。
使用 儲存過程將定製錯誤資訊新增到sysmessages 表裡。以後,在使用RAISERROR 時候就可以引用新的資訊ID號。

定製錯誤資訊的標識號必須大於等於50000,資訊本身的長度不能超過255個字元。
下面是例子,建立新的資訊,賦予識別號55555,級別為10,呼叫方式如下:sp_addmessage 55555, 10, 'New error message.'
你可以在儲存程式中增加提交新的錯誤:RAISERROR 55555, 10

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/66009/viewspace-786087/,如需轉載,請註明出處,否則將追究法律責任。

相關文章