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:硬體錯誤這些訊息表明某些類型的媒體失敗。系統管理員可能必須重新裝載資料庫。可能還有必要給硬體廠商打電話。