返回用戶定義的錯(cuò)誤信息并設(shè)系統(tǒng)標(biāo)志,記錄發(fā)生錯(cuò)誤。通過使用 RAISERROR 語句,客戶端可以從 sysmessages 表中檢索條目,或者使用用戶指定的嚴(yán)重度和狀態(tài)信息動(dòng)態(tài)地生成一條消息。這條消息在定義后就作為服務(wù)器錯(cuò)誤信息返回給客戶端。
RAISERROR ( { msg_id | msg_str } { , severity , state }
[ , argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
msg_id
存儲(chǔ)于 sysmessages 表中的用戶定義的錯(cuò)誤信息。用戶定義錯(cuò)誤信息的錯(cuò)誤號(hào)應(yīng)大于 50,000。由特殊消息產(chǎn)生的錯(cuò)誤是第 50,000 號(hào)。
msg_str
是一條特殊消息,其格式與 C 語言中使用的 PRINTF 格式樣式相似。此錯(cuò)誤信息最多可包含 400 個(gè)字符。如果該信息包含的字符超過 400 個(gè),則只能顯示前 397 個(gè)并將添加一個(gè)省略號(hào)以表示該信息已被截?cái)唷K刑囟ㄏ⒌臉?biāo)準(zhǔn)消息 ID 是 14,000。
msg_str 支持下面的格式:
% [[flag] [width] [precision] [{h | l}]] type
可在 msg_str 中使用的參數(shù)包括:
flag
用于確定用戶定義的錯(cuò)誤信息的間距和對(duì)齊的代碼。
代碼 | 前綴或?qū)R | 描述 |
---|---|---|
-(減) | 左對(duì)齊 | 在給定字段寬度內(nèi)左對(duì)齊結(jié)果。 |
+(加) | +(加)或 -(減)前綴 | 如果輸出值為帶符號(hào)類型,則在輸出值的前面加上加號(hào)(+)或減號(hào)(-)。 |
0(零) | 零填充 | 如果寬度的前面有 0,則添加零直到滿足最小寬度。若出現(xiàn) 0 和 -,將忽略 0。若使用整型格式(i, u, x, X, o, d)指定 0,則忽略 0。 |
#(數(shù)字) | 對(duì) x 或 X 的十六進(jìn)制類型使用 0x 前綴 | 當(dāng)使用 o、x 或 X 格式時(shí),# 標(biāo)志在任何非零值的前面分別加上 0、0x 或 0X。當(dāng) d、i 或 u 的前面有 # 標(biāo)記時(shí),將忽略該標(biāo)記。 |
' '(空格) | 空格填充 | 如果輸出值帶符號(hào)且為正,則在該值前加空格。如果包含在加號(hào)(+)標(biāo)記中,則忽略該標(biāo)記。 |
width
定義最小寬度的整數(shù)。星號(hào) (*) 允許 precision 確定寬度。
precision
是輸出字段最多輸出的字符數(shù),或?yàn)檎麛?shù)值輸出的最小小數(shù)位數(shù)。星號(hào) (*) 允許 argument 確定精度。
{h | l} type
與字符類型 d、i、o、x、X 或 u 一起使用,用于創(chuàng)建 short int (h) 或 long int (l) 類型的值。
字符類型 | 表示 |
---|---|
d 或 I | 帶符號(hào)的整數(shù) |
o | 不帶符號(hào)的八進(jìn)制數(shù) |
p | 指針型 |
s | String |
u | 不帶符號(hào)的整數(shù) |
x 或 X | 不帶符號(hào)的十六進(jìn)制數(shù) |
說明 不支持 float、雙精度和單精度字符類型。
severity
用戶定義的與消息關(guān)聯(lián)的嚴(yán)重級(jí)別。用戶可以使用從 0 到 18 之間的嚴(yán)重級(jí)別。19 到 25 之間的嚴(yán)重級(jí)別只能由 sysadmin 固定服務(wù)器角色成員使用。若要使用 19 到 25 之間的嚴(yán)重級(jí)別,必須選擇 WITH LOG 選項(xiàng)。
注意 20 到 25 之間的嚴(yán)重級(jí)別被認(rèn)為是致命的。如果遇到致命的嚴(yán)重級(jí)別,客戶端連接將在收到消息后終止,并將錯(cuò)誤記入錯(cuò)誤日志和應(yīng)用程序日志。
state
從 1 到 127 的任意整數(shù),表示有關(guān)錯(cuò)誤調(diào)用狀態(tài)的信息。state 的負(fù)值默認(rèn)為 1。
argument
是用于取代在 msg_str 中定義的變量或取代對(duì)應(yīng)于 msg_id 的消息的參數(shù)??梢杂?0 或更多的替代參數(shù);然而,替代參數(shù)的總數(shù)不能超過 20 個(gè)。每個(gè)替代參數(shù)可以是局部變量或這些任意數(shù)據(jù)類型:int1、int2、int4、char、varchar、binary 或 varbinary。不支持其它數(shù)據(jù)類型。
option
錯(cuò)誤的自定義選項(xiàng)。option 可以是以下值之一:
值 | 描述 |
---|---|
LOG | 將錯(cuò)誤記入服務(wù)器錯(cuò)誤日志和應(yīng)用程序日志。記入服務(wù)器錯(cuò)誤日志的錯(cuò)誤目前被限定為最多 440 字節(jié)。 |
NOWAIT | 將消息立即發(fā)送給客戶端。 |
SETERROR | 將 @@ERROR 的值設(shè)置為 msg_id 或 50000,與嚴(yán)重級(jí)別無關(guān)。 |
如果使用 sysmessages 錯(cuò)誤并且是使用前面顯示的 msg_str 格式創(chuàng)建的消息,則將給所提供的 msg_id 的消息傳遞提供的參數(shù)(argument1、argument2 等等)。
當(dāng)使用 RAISERROR 創(chuàng)建和返回用戶定義的錯(cuò)誤信息時(shí),使用 sp_addmessage 添加用戶定義的錯(cuò)誤信息,使用 sp_dropmessage 刪除用戶定義的錯(cuò)誤信息。
當(dāng)出現(xiàn)錯(cuò)誤時(shí),錯(cuò)誤號(hào)將放在 @@ERROR 函數(shù)中,該函數(shù)存儲(chǔ)最新生成的錯(cuò)誤號(hào)。對(duì)于嚴(yán)重級(jí)別為 1 到 10 的消息,@@ERROR 的默認(rèn)設(shè)置為0。
下例顯示可能出現(xiàn)的兩種錯(cuò)誤。第一種錯(cuò)誤很簡(jiǎn)單,生成的是靜態(tài)消息。第二種錯(cuò)誤則是在嘗試修改的基礎(chǔ)上動(dòng)態(tài)生成的。
CREATE TRIGGER employee_insupd
ON employee
FOR INSERT, UPDATE
AS
/* Get the range of level for this job type from the jobs table. */
DECLARE @@MIN_LVL tinyint,
@@MAX_LVL tinyint,
@@EMP_LVL tinyint,
@@JOB_ID smallint
SELECT @@MIN_LVl = min_lvl,
@@MAX_LV = max_lvl,
@@ EMP_LVL = i.job_lvl,
@@JOB_ID = i.job_id
FROM employee e, jobs j, inserted i
WHERE e.emp_id = i.emp_id AND i.job_id = j.job_id
IF (@@JOB_ID = 1) and (@@EMP_lVl <> 10)
BEGIN
RAISERROR ('Job id 1 expects the default level of 10.', 16, 1)
ROLLBACK TRANSACTION
END
ELSE
IF NOT @@ EMP_LVL BETWEEN @@MIN_LVL AND @@MAX_LVL)
BEGIN
RAISERROR ('The level for job_id:%d should be between %d and %d.',
16, 1, @@JOB_ID, @@MIN_LVL, @@MAX_LVL)
ROLLBACK TRANSACTION
END
下例顯示如何通過執(zhí)行 employee_insupd 觸發(fā)器獲得與 RAISERROR 相同的效果,而 RAISERROR 使用給存儲(chǔ)在 sysmessages 表中的消息傳遞參數(shù)的方法。該消息通過 sp_addmessage 系統(tǒng)存儲(chǔ)過程,以消息號(hào) 50005 被添加到 sysmessages 表中。
說明 下例僅供舉例說明。
RAISERROR (50005, 16, 1, @@JOB_ID, @@MIN_LVL, @@MAX_LVL)
相關(guān)文章