RAISERROR error-number [ format-string ] [, arg-list ]

來源:互聯網
上載者:User

轉載至: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]
標準和相容性
  • SQL/92     Transact-SQL 擴充。

  • SQL/99     Transact-SQL 擴充。

  • Sybase     受 Adaptive Server Enterprise 支援。

樣本

下面的語句引發錯誤 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.