sql server raiseerror的用法
RAISERROR
返回用戶定義的錯誤信息並設系統標志,記錄發生錯誤。通過使用 RAISERROR 語句,客戶端可以從 sysmessages 表中檢索條目,或者使用用戶指定的嚴重度和狀態信息動態地生成一條消息。這條消息在定義后就作為服務器錯誤信息返回給客戶端。
語法
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
用於確定用戶定義的錯誤信息的間距和對齊的代碼。
代碼 前綴或對齊 描述
-(減) 左對齊 在給定字段寬度內左對齊結果。
+(加) +(加)或 -(減)前綴 如果輸出值為帶符號類型,則在輸出值的前面加上加號(+)或減號(-)。
0(零) 零填充 如果寬度的前面有 0,則添加零直到滿足最小寬度。若出現 0 和 -,將忽略 0。若使用整型格式(i, u, x, X, o, d)指定 0,則忽略 0。
#(數字) 對 x 或 X 的十六進制類型使用 0x 前綴 當使用 o、x 或 X 格式時,# 標志在任何非零值的前面分別加上 0、0x 或 0X。當 d、i 或 u 的前面有 # 標記時,將忽略該標記。
' '(空格) 空格填充 如果輸出值帶符號且為正,則在該值前加空格。如果包含在加號(+)標記中,則忽略該標記。
width
定義最小寬度的整數。星號 (*) 允許 precision 確定寬度。
precision
是輸出字段最多輸出的字符數,或為整數值輸出的最小小數位數。星號 (*) 允許 argument 確定精度。
{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,與嚴重級別無關。
注釋
如果使用 sysmessages 錯誤並且是使用前面顯示的 msg_str 格式創建的消息,則將給所提供的 msg_id 的消息傳遞提供的參數(argument1、argument2 等等)。
當使用 RAISERROR 創建和返回用戶定義的錯誤信息時,使用 sp_addmessage 添加用戶定義的錯誤信息,使用 sp_dropmessage 刪除用戶定義的錯誤信息。
當出現錯誤時,錯誤號將放在 @@ERROR 函數中,該函數存儲最新生成的錯誤號。對於嚴重級別為 1 到 10 的消息,@@ERROR 的默認設置為0。
示例
A. 創建特定消息
下例顯示可能出現的兩種錯誤。第一種錯誤很簡單,生成的是靜態消息。第二種錯誤則是在嘗試修改的基礎上動態生成的。
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
B. 在 sysmessages 中創建特殊消息
下例顯示如何通過執行 employee_insupd 觸發器獲得與 RAISERROR 相同的效果,而 RAISERROR 使用給存儲在 sysmessages 表中的消息傳遞參數的方法。該消息通過 sp_addmessage 系統存儲過程,以消息號 50005 被添加到 sysmessages 表中。
說明 下例僅供舉例說明。
RAISERROR (50005, 16, 1, @@JOB_ID, @@MIN_LVL, @@MAX_LVL)
錯誤信息Microsoft® SQL Server&S482; 2000 在遇到問題時,根據嚴重級別,將把 sysmessages 系統表中的消息寫入 SQL Server 錯誤日志和 Microsoft Windows® 2000 或 Microsoft Windows NT® 4.0 應用程序日志,或者將消息發送到客戶端。可以在遇到問題時由 SQL Server 返回錯誤信息,也可以使用 RAISERROR 語句手工生成錯誤信息。RAISERROR 語句提供集中錯誤信息管理。RAISERROR 可以從 sysmessages 表檢索現有條目,也可以使用硬編碼(用戶定義)消息。RAISERROR 返回用戶定義的錯誤信息時,還設置系統變量記錄所發生的錯誤。消息可以包括 C PRINTF 樣式的格式字符串,該格式字符串可在運行時由 RAISERROR 指定的參數填充。這條消息在定義后就作為服務器錯誤信息發送回客戶端。無論是從 SQL Server 返回,還是通過 RAISERROR 語句返回,每條消息都包含:唯一標識該錯誤信息的消息號。表明問題類型的嚴重級別。標識發出錯誤的來源的錯誤狀態號(如果錯誤可以從多個位置發出)。聲明問題(有時還有可能的解決方法)的消息正文。例如,如果訪問的表不存在:SELECT *FROM bogus發送到客戶端的錯誤信息類似下面所示:服務器:錯誤信息 208,級別 16,狀態 1對象名 'bogus' 無效。查詢 master 數據庫中的 sysmessages 表可以查看 SQL Server 錯誤信息列表。有關 sysmessages 的更多信息,請參見系統錯誤信息。錯誤信息嚴重級別錯誤信息嚴重級別可用來表明 Microsoft® SQL Server&S482; 2000 所遇到問題的類型。嚴重級別為 10 的信息為信息消息,表明問題是由於輸入信息時發生錯誤而產生的。嚴重級別為 11 到 16 的錯誤是由用戶產生的,可以由用戶修正。嚴重級別從 17 到 25 的錯誤表明軟件或硬件錯誤。當所發生的問題產生嚴重級別為 17 或更高的錯誤時,應通知系統管理員。系統管理員必須解析這些錯誤,並跟蹤錯誤發生的頻率。當發生級別為 17、18 或 19 的錯誤時,盡管某個特定的語句無法執行,但仍可繼續。系統管理員應對能生成嚴重級別從 17 到 25 的所有問題進行監視,並打印包含信息的錯誤日志,回找發生錯誤的位置。如果問題影響了整個數據庫,可以使用 DBCC CHECKDB(數據庫)確定損壞的程度。DBCC 可以對必須刪除的一些對象進行標識,並有選擇地修復損壞。如果損壞范圍大,則必須對數據庫進行還原。用 RAISERROR 指定用戶定義的錯誤信息時,使用大於 50,000 的錯誤信息號以及從 0 到 18 的嚴重級別。只有系統管理員可以發出嚴重級別從 19 到 25 的 RAISERROR 錯誤。嚴重級別 0 到 19嚴重級別為 10 的錯誤信息為信息錯誤。嚴重級別從 11 到 16 的錯誤信息由用戶生成並可以由用戶修正。嚴重級別為 17 和 18 的錯誤信息是由資源或系統錯誤產生的;用戶會話不會中斷。使用 sp_addmessage,可以將嚴重級別從 1 到 25 的用戶定義消息添加到 sysmessages。只有系統管理員可以添加嚴重級別從 19 到 25 的消息。對於嚴重級別為 17 和更高的錯誤信息,應向系統管理員報告。嚴重級別 10:狀態信息這是信息消息,表明問題是由於用戶輸入信息有誤而產生的。嚴重級別 0 在 SQL Server 中是見不到的。嚴重級別 11 到 16這些消息表明錯誤可由用戶修正。嚴重級別 17:資源不足這些消息表明語句導致 SQL Server 用盡資源(如數據庫的鎖或磁盤空間)或超出了系統管理員設置的一些限制。嚴重級別 18:檢測到非嚴重內部錯誤這些消息表明存在某種類型的內部軟件問題,但語句執行完畢,並且到 SQL Server 的連接還保持着。例如,當 SQL Server 查詢處理器在進行查詢優化時檢測到一個內部錯誤,則出現嚴重級別為 18 的消息。每次出現嚴重級別為 18 的消息時,都應告知系統管理員。嚴重級別 19:資源中發生 SQL Server 錯誤這些消息表明已超出了 nonconfigurable 內部限制,並且當前批處理終止。嚴重級別 19 錯誤很少發生;但是,一旦發生,必須由系統管理員或主要支持提供者修正。每次出現嚴重級別為 19 的消息時,都應告知系統管理員。嚴重級別 20 到 25嚴重級別從 20 到 25 表明有系統問題。這是些嚴重錯誤,意味着進程(完成語句中指定任務的程序代碼)將不再運行。進程在停止前先凍結,記錄有關發生內容的信息,然后終止。到 SQL Server 的客戶連接將關閉,並且根據存在問題的不同,客戶端有可能無法重新連接。嚴重級別為 19 或更高的錯誤信息將停止當前的批處理。嚴重級別為 20 或更高的錯誤信息被認為是嚴重錯誤,將終止客戶連接。此范圍的錯誤信息可能影響數據庫中的所有進程,並可能表明數據庫或對象損壞。嚴重級別從 19 到 25 的錯誤信息均寫入錯誤日志。嚴重級別 20:當前進程中的 SQL Server 嚴重錯誤這些消息表明語句遇到了問題。由於該問題所影響的只是當前進程,數據庫本身損壞的可能性不大。嚴重級別 21:數據庫 (dbid) 進程中的 SQL Server 嚴重錯誤這些消息表明遇到了影響當前數據庫中所有進程的問題;但數據庫本身損壞的可能性不大。嚴重級別 22:SQL Server 嚴重錯誤表的完整性置疑這些消息表明消息中所指定的表或索引已因軟件或硬件問題而損壞。嚴重級別 22 錯誤很少發生;但是,如果遇到該錯誤,請運行 DBCC CHECKDB 確定數據庫中是否有其它對象也受損壞。問題有可能只存在於超速緩存中,而不是存在於磁盤本身。如果是這樣,重新啟動 SQL Server 將修正該問題。要繼續工作,必須重新連接到 SQL Server。否則,用 DBCC 修復該問題。有些情況下,有必要還原數據庫。如果重新啟動幫助不大,則問題存在於磁盤上。有時,摧毀在錯誤信息中指定的對象可以解決該問題。例如,如果消息說 SQL Server 在非聚集索引中發現長度為 0 的行,刪除該索引然后重建。嚴重級別 23:SQL Server 嚴重錯誤:數據庫完整性置疑這些消息表明由於硬件或軟件問題,整個數據庫完整性存在問題。嚴重級別 23 錯誤很少發生;但是,如果遇到,請運行 DBCC CHECKDB 確定損壞的程度。問題有可能只存在於超速緩存中,而不是存在於磁盤本身。如果是這樣,重新啟動 SQL Server 將修正該問題。要繼續工作,必須重新連接到 SQL Server。否則,用 DBCC 修復該問題。有些情況下,有必要重新啟動數據庫。嚴重級別 24:硬件錯誤這些消息表明某些類型的媒體失敗。系統管理員可能必須重新裝載數據庫。可能還有必要給硬件廠商打電話。
