轉載至:http://hi.baidu.com/software_2008/blog/item/7d768731dde7ee11eac4af16.html
系統預定義錯誤碼
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 |
指標型 |
| s |
String |
| 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
四 定製錯誤資訊
當然,大多數情況下,錯誤資訊會使用多次,一遍一遍的輸入相同的資訊顯然不理智。
使用sp_addmessage 預存程序將定製錯誤資訊添加到sysmessages 表裡。以後,在使用RAISERROR 時候就可以引用新的資訊ID號。
定製錯誤資訊的標識號必須大於等於50000,資訊本身的長度不能超過255個字元。
下面是例子,建立新的資訊,賦予識別號55555,層級為10,調用方式如下:sp_addmessage 55555, 10, 'New error message.'
你可以在儲存進程中增加提交新的錯誤:RAISERROR 55555, 10
說明
此語句用於發出錯誤訊號和向用戶端發送訊息。
文法
RAISERROR error-number [ format-string ] [, arg-list ]
參數
error-number error-number 是大於 17000 的五位整數。錯誤號碼儲存在全域變數 @@error 中。
format-string 如果未提供 format-string 或者其為空白,則使用錯誤號碼在系統資料表中尋找錯誤訊息。Adaptive Server Enterprise 從 SYSMESSAGES 表中擷取的訊息範圍為 17000-19999。在 Adaptive Server Anywhere 中,此表為空白視圖,因此這個範圍內的錯誤訊息應該提供格式字串。編號為 20000 或更大的錯誤訊息從 SYS.SYSUSERMESSAGES 表中擷取。
在 Adaptive Server Anywhere 中,format-string 的長度最多可達 255 位元組。
Adaptive Server Enterprise 中的 RAISERROR 陳述式支援的擴充值在 Adaptive Server Anywhere 中不受支援。
對於選擇性參數列表中的參數,格式字串可以包含預留位置。這些預留位置的形式為 %nn!,其中 nn 是介於 1 到 20 之間的整數。
中間 RAISERROR 狀態和代碼資訊在過程終止後會丟失。如果在返回時伴隨 RAISERROR 發生了錯誤,則返回錯誤資訊,而 RAISERROR 資訊將丟失。應用程式可以通過在不同的執行點檢查 @@error 全域變數,查詢中間 RAISERROR 狀態。
用法
RAISERROR 陳述式允許發出使用者定義的錯誤並向用戶端發送訊息。
許可權
無。
副作用
無。
另請參見
- CREATE TRIGGER 語句 [T-SQL]
- ON_TSQL_ERROR 選項 [compatibility]
- CONTINUE_AFTER_RAISERROR 選項 [compatibility]
標準和相容性
樣本
下面的語句引發錯誤 23000(該錯誤在使用者定義的錯誤範圍內)並向用戶端發送訊息。請注意在 error-number 和 format-string 參數之間有一個逗號。逗號後的第一項被解釋為參數列表中的第一項。
RAISERROR 23000 'Invalid entry for this column: %1!', @val
下一個樣本使用 RAISERROR 禁止串連。
create procedure DBA.login_check()
begin
// Allow a maximum of 3 concurrentconnections
if( db_property('ConnCount') > 3 ) then
raiserror 28000
'User %1! is not allowed to connect -- thereare already %2! users logged on',
current user,
cast(db_property('ConnCount') as int)-1;
else
call sp_login_environment;
end if;
end
go
grant execute on DBA.login_check to PUBLIC
go
set optionPUBLIC.Login_procedure='DBA.login_check'
go