1. 程式人生 > 資料庫 >在sqlserver 的函式或儲存過程中丟擲異常(raiserror )【轉載】

在sqlserver 的函式或儲存過程中丟擲異常(raiserror )【轉載】

raiserror的作用: raiserror 是用於丟擲一個錯誤

其語法如下:

RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ]
)
[ WITH option [ ,...n ] ]

簡要說明一下:

第一個引數:{ msg_id | msg_str | @local_variable }
msg_id:表示可以是一個sys.messages表中定義的訊息代號;
使用 sp_addmessage 儲存在 sys.messages 目錄檢視中的使用者定義錯誤訊息號。

使用者定義錯誤訊息的錯誤號應當大於 50000。

 msg_str:表示也可以是一個使用者定義訊息,該錯誤訊息最長可以有 2047 個字元;
         (如果是常量,請使用N'xxxx',因為是nvarchar的)
          當指定 msg_str 時,RAISERROR 將引發一個錯誤號為 5000 的錯誤訊息。

 @local_variable:表示也可以是按照 msg_str 方式的格式化字串變數。

第二個引數:severity
使用者定義的與該訊息關聯的嚴重級別。(這個很重要)
任何使用者都可以指定 0 到 18 之間的嚴重級別。
[0,10]的閉區間內,不會跳到catch;
如果是[11,19],則跳到catch;

如果[20,無窮),則直接終止資料庫連線;

第三個引數:state
如果在多個位置引發相同的使用者定義錯誤,
則針對每個位置使用唯一的狀態號有助於找到引發錯誤的程式碼段。

        介於 1 至 127 之間的任意整數。(state 預設值為1)
        當state 值為 0 或大於 127 時會生成錯誤!

第四個引數:argument
用於代替 msg_str 或對應於 msg_id 的訊息中的定義的變數的引數。

第五個引數:option
錯誤的自定義選項,可以是下表中的任一值:
LOG :在錯誤日誌和應用程式日誌中記錄錯誤;
NOWAIT:將訊息立即傳送給客戶端;
SETERROR:將 @@ERROR 值和 ERROR_NUMBER 值設定為 msg_id 或 50000;

[SQL]程式碼示例

--示例1DECLARE @raiseErrorCode nvarchar(50)
SET @raiseErrorCode = CONVERT(nvarchar(50), YOUR UNIQUEIDENTIFIER KEY)
RAISERROR('%s INVALID ID. There is no record in table',16,1, @raiseErrorCode)

--示例2RAISERROR (
N'This is message %s %d.', -- Message text,
10, -- Severity,
1, -- State,
N'number', -- First argument.
5 -- Second argument.
);
-- The message text returned is: This is message number 5.
GO

--示例3RAISERROR (N'<<%.s>>', -- Message text.
10, -- Severity,
1, -- State,
7, -- First argument used for width.
3, -- Second argument used for precision.
N'abcde'); -- Third argument supplies the string.
-- The message text returned is: << abc>>.
GO

--示例4RAISERROR (N'<<%7.3s>>', -- Message text.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO

--示例5
--A. 從 CATCH 塊返回錯誤訊息
以下程式碼示例顯示如何在 TRY 塊中使用 RAISERROR 使執行跳至關聯的 CATCH 塊中。
它還顯示如何使用 RAISERROR 返回有關呼叫 CATCH 塊的錯誤的資訊。

BEGIN TRY
RAISERROR ('Error raised in TRY block.', -- Message text.
16, -- Severity.
1 -- State.
);
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;

SELECT 
    @ErrorMessage = ERROR_MESSAGE(),
    @ErrorSeverity = ERROR_SEVERITY(),
    @ErrorState = ERROR_STATE();

RAISERROR (@ErrorMessage,  -- Message text.
           @ErrorSeverity, -- Severity.
           @ErrorState     -- State.
           );

END CATCH;

--示例6
--B. 在 sys.messages 中建立即席訊息
以下示例顯示如何引發 sys.messages 目錄檢視中儲存的訊息。
該訊息通過 sp_addmessage 系統儲存過程,以訊息號50005新增到 sys.messages 目錄檢視中。

sp_addmessage @msgnum = 50005,
@severity = 10,
@msgtext = N'<<%7.3s>>';
GO

RAISERROR (50005, -- Message id.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO

sp_dropmessage @msgnum = 50005;
GO

--示例7
--C. 使用區域性變數提供訊息文字
以下程式碼示例顯示如何使用區域性變數為 RAISERROR 語句提供訊息文字。sp_addmessage @msgnum = 50005,
@severity = 10,
@msgtext = N'<<%7.3s>>';
GO

RAISERROR (50005, -- Message id.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO

sp_dropmessage @msgnum = 50005;
GO

原文: