相關信息
語法RAISERROR ( { msg_id | msg_str } { , severity , state }
[ , argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
參數msg_id
存儲於 sys.messages 表中的用戶定義的錯誤信息。用戶定義錯誤信息的錯誤號應大於 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。
示例
創建特定訊息
下例顯示可能出現的兩種錯誤。第一種錯誤很簡單,生成的是靜態訊息。第二種錯誤則是在嘗試修改的基礎上動態生成的。
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
sysmessages 創建特殊
下例顯示如何通過執行 employee_insupd 觸發器獲得與 RAISERROR 相同的效果,而 RAISERROR 使用給存儲在 sysmessages 表中的訊息傳遞參數的方法。該訊息通過 sp_addmessage 系統存儲過程,以訊息號 50005 被添加到 sysmessages 表中。
說明 下例僅供舉例說明。
RAISERROR (50005, 16, 1, @@JOB_ID, @@MIN_LVL, @@MAX_LVL)
錯誤信息Microsoft® SQL Server™ 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™ 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:硬體錯誤
這些訊息表明某些類型的媒體失敗。系統管理員可能必須重新裝載資料庫。可能還有必要給硬體廠商打電話。