sqlserver中raiseerror函式的用法
server資料庫中raiserror的作用就和asp.net中的throw new Exception一樣,用於丟擲一個異常或錯誤。這個錯誤可以被程式捕捉到。
raiserror的常用格式如下:
raiserror('錯誤的描述',錯誤的嚴重級別程式碼,錯誤的標識,錯誤的描述中的引數的值(這個可以是多個),一些其它引數),在官方上的格式描述如下:
- RAISERROR ( { msg_id | msg_str | @local_variable }
- { ,severity ,state }
- [ ,argument [ ,...n ] ] )
-
[ WITH
其中,[ ,argument [ ,...n ] ]與 [ WITH option [ ,...n ] 兩項是可以不寫的。
分別解釋一下各引數的用法:
一、{ msg_id | msg_str | @local_variable }
從這個引數中可以看出,這一項可能為三個值,
1,sys.messages中的自定義錯誤資訊的錯誤資訊號,自定義錯誤資訊可以使用sp_addmessage儲存過程新增到sys.messages中,注意, 使用者定義錯誤訊息的錯誤號應當大於 50000。
示例:raiserror(50001,16,1)
2,一條直接的錯誤描述,示例:raiserror('這裡是錯誤描述的示例',16,1)
3,一個包含錯誤描述變數,示例:
- declare @error_mes varchar(1000)
- set @error_mes='這裡是錯誤描述的示例'
- raiserror(@error_mes,16,1)
二、severity
這個引數為使用者定義的該錯誤資訊的級別,我們可以指定 0 到 18 之間的嚴重級別。只有 sysadmin 固定伺服器角色成員或具有 ALTER TRACE 許可權的使用者才能指定 19 到 25 之間的嚴重級別。若要使用 19 到 25 之間的嚴重級別,必須選擇 WITH LOG 選項。
注意,如果錯誤級別在20~25之間,那麼資料庫會認為這個錯誤是致命,那麼資料庫會將該錯誤記錄到錯誤日誌和應用程式日誌後終止資料庫的連線。任何小於 0 的嚴重級別被認為等於0。大於 25 的嚴重級別被認為等於25。
三、state
這個引數是可以是1~127之間任意整數,可以用來標識錯誤的發生位置,如果一段程式碼的多個位置都會發生同樣的錯誤,那麼就可以將這個引數設定為不同的值,用來標識是那個位
置發生錯誤了。
四、[ ,argument [ ,...n ] ]
如果引數{ msg_id | msg_str | @local_variable }中包含了一些代替符,那麼這個引數就是代替符的具體的值,這個和asp.net中的string.Format用法是一樣的。示例如下:
- declare @error_mes varchar(1000)
- set @error_mes='這裡是使用者%s引發的錯誤描述'
- raiserror(@error_mes,16,1,'張三')
也可以是這樣,可能適用性更廣些。
- declare @error_mes varchar(1000)
- declare @error_obj varchar(1000)
- select @error_obj=namefrom table_users where……
- set @error_mes='這裡是使用者%s引發的錯誤描述'
- raiserror(@error_mes,16,1,@error_obj)
上面程式碼中的%s,代表它要替代是一個字串,如果我們把示例寫成下面這樣就會報錯了:
- declare @error_mes varchar(1000)
- set @error_mes='這裡是使用者%s引發的錯誤描述'
- raiserror(@error_mes,16,1,1)
因為1不是一個字串,如果要替代是一個整數,就需要使用%i或者%d了。所有的對應關係如下:
1,%d或%i代表有符號整數
2,%u代表無符號整數
3,%o代表無符號八進位制數
4,%s代表字串
5,%x或%X代表 無符號十六進位制數
五、[ WITH option [ ,...n ] ]
該引數為錯誤的自定義選項,可以是下面三個值中的一個:
1,LOG--在 Microsoft SQL Server 資料庫引擎 例項的錯誤日誌和應用程式日誌中記錄錯誤。記錄到錯誤日誌的錯誤目前被限定為最多 440 位元組。只有 sysadmin 固定伺服器角色
成員或具有 ALTER TRACE 許可權的使用者才能指定 WITH LOG。
2,NOWAIT--將訊息立即傳送給客戶端。
3,SETERROR--將 @@ERROR 值和 ERROR_NUMBER 值設定為 msg_id 或 50000,不用考慮嚴重級別。
我們還可以在Begin catch中使用raiserror。示例如下:
- begin try
- raiserror('這是一個錯誤',16,1) //注意,只有severity級別在11~19之間,控制才會跳轉到catch塊中。
- end try
- begin catch
- declare @error_message varchar(1000)
- set @error_message=error_message()
- raiserror(@error_message,16,1)
- return
- end catch