RAISERROR (Transact-SQL)
來(lái)源:
| SQL Server 2005 聯(lián)機(jī)叢書 |
生成錯(cuò)誤消息并啟動(dòng)會(huì)話的錯(cuò)誤處理。RAISERROR 可以引用 sys.messages 目錄視圖中存儲(chǔ)的用戶定義消息,也可以動(dòng)態(tài)建立消息。該消息作為服務(wù)器錯(cuò)誤消息返回到調(diào)用應(yīng)用程序,或返回到 TRY…CATCH 構(gòu)造的關(guān)聯(lián) CATCH 塊。
語(yǔ)法
| RAISERROR ( { msg_id | msg_str | @local_variable }{ ,severity ,state }[ ,argument [ ,...n ] ] )[ WITH option [ ,...n ] ] |
備注
<?XML:NAMESPACE PREFIX = [default] http://ddue.schemas.microsoft.com/authoring/2003/5 NS = "http://ddue.schemas.microsoft.com/authoring/2003/5" />
RAISERROR 生成的錯(cuò)誤與數(shù)據(jù)庫(kù)引擎?代碼生成的錯(cuò)誤的運(yùn)行方式相同。RAISERROR 指定的值由 ERROR_LINE、ERROR_MESSAGE、ERROR_NUMBER、ERROR_PROCEDURE、ERROR_SEVERITY、ERROR_STATE 以及 @@ERROR 等系統(tǒng)函數(shù)來(lái)報(bào)告。當(dāng) RAISERROR 在嚴(yán)重級(jí)別為 11 或更高的情況下在 TRY 塊中運(yùn)行,它便會(huì)將控制傳輸至關(guān)聯(lián)的 CATCH 塊。如果 RAISERROR 在下列情況下運(yùn)行,便會(huì)將錯(cuò)誤返回到調(diào)用方:
在任何 TRY 塊的作用域之外運(yùn)行。
在嚴(yán)重級(jí)別為 10 或更低的情況下在 TRY 塊中運(yùn)行。
在嚴(yán)重級(jí)別為 20 或更高的情況下終止數(shù)據(jù)庫(kù)連接。
CATCH 塊可以使用 RAISERROR 來(lái)再次引發(fā)調(diào)用 CATCH 塊的錯(cuò)誤,方法是使用 ERROR_NUMBER 和 ERROR_MESSAGE 之類的系統(tǒng)函數(shù)檢索原始錯(cuò)誤消息。對(duì)于嚴(yán)重級(jí)別為 1 到 10 的消息,@@ERROR 默認(rèn)值為 0。有關(guān)詳細(xì)信息,請(qǐng)參閱在 Transact-SQL 中使用 TRY...CATCH。
當(dāng) msg_id 指定 sys.messages 目錄視圖中可用的用戶定義消息時(shí),RAISERROR 按照與應(yīng)用到使用 msg_str 指定的用戶定義消息文本的規(guī)則相同的規(guī)則處理文本列中的消息。用戶定義消息文本可以包含轉(zhuǎn)換規(guī)格,并且 RAISERROR 將參數(shù)值映射到轉(zhuǎn)換規(guī)格。使用 sp_addmessage 添加用戶定義錯(cuò)誤消息,而使用 sp_dropmessage 刪除用戶定義錯(cuò)誤消息。
RAISERROR 可以替代 PRINT 將消息返回到調(diào)用應(yīng)用程序。RAISERROR 支持類似于 C 標(biāo)準(zhǔn)庫(kù)中 printf 函數(shù)功能的字符替代,而 Transact-SQL PRINT 語(yǔ)句則不支持。PRINT 語(yǔ)句不受 TRY 塊的影響,而在嚴(yán)重級(jí)別為 11 到 19 的情況下在 TRY 塊中運(yùn)行的 RAISERROR 會(huì)將控制傳輸至關(guān)聯(lián)的 CATCH 塊。指定嚴(yán)重級(jí)別為 10 或更低以使用 RAISERROR 返回 TRY 塊中的消息,而不必調(diào)用 CATCH 塊。
通常,連續(xù)的參數(shù)替換連續(xù)的轉(zhuǎn)換規(guī)格;第一個(gè)參數(shù)替換第一個(gè)轉(zhuǎn)換規(guī)格,第二個(gè)參數(shù)替換第二個(gè)轉(zhuǎn)換規(guī)格,以此類推。例如,在以下 RAISERROR 語(yǔ)句中,第一個(gè)參數(shù)
N'number'
代替第一個(gè)轉(zhuǎn)換規(guī)格 %s,,第二個(gè)參數(shù) 5 代替第二個(gè)轉(zhuǎn)換規(guī)格 %d。
| RAISERROR (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 |
如果為轉(zhuǎn)換規(guī)格的寬度或精度指定了星號(hào) (*),則要用于寬度或精度的值被指定為整數(shù)參數(shù)值。在這種情況下,一個(gè)轉(zhuǎn)換規(guī)格最多可以使用三個(gè)參數(shù),分別用作寬度、精度和替代值。
例如,下列兩個(gè) RAISERROR 語(yǔ)句都返回相同的字符串。一個(gè)指定參數(shù)列表中的寬度值和精度值;另一個(gè)指定轉(zhuǎn)換規(guī)格中的寬度值和精度值:
| RAISERROR (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 RAISERROR (N'<<%7.3s>>', -- Message text.10, -- Severity,1, -- State,N'abcde'); -- First argument supplies the string. -- The message text returned is: << abc>>. GO |
參數(shù)
msg_id
使用 sp_addmessage 存儲(chǔ)在 sys.messages 目錄視圖中的用戶定義錯(cuò)誤消息號(hào)。用戶定義錯(cuò)誤消息的錯(cuò)誤號(hào)應(yīng)當(dāng)大于 50000。如果未指定 msg_id,則 RAISERROR 引發(fā)一個(gè)錯(cuò)誤號(hào)為 50000 的錯(cuò)誤消息。
用戶定義消息,格式與 C 標(biāo)準(zhǔn)庫(kù)中的 printf 函數(shù)類似。該錯(cuò)誤消息最長(zhǎng)可以有 2,047 個(gè)字符。如果該消息包含的字符數(shù)等于或超過(guò) 2,048 個(gè),則只能顯示前 2,044 個(gè)并添加一個(gè)省略號(hào)以表示該消息已被截?cái)唷U?qǐng)注意,由于內(nèi)部存儲(chǔ)行為的緣故,替代參數(shù)使用的字符數(shù)比輸出所顯示的字符數(shù)要多。例如,賦值為 2 的代替參數(shù) %d 實(shí)際在消息字符串中生成一個(gè)字符,但是還會(huì)在內(nèi)部占用另外三個(gè)存儲(chǔ)字符串。此存儲(chǔ)要求減少了可用于消息輸出的字符數(shù)。
當(dāng)指定 msg_str 時(shí),RAISERROR 將引發(fā)一個(gè)錯(cuò)誤號(hào)為 5000 的錯(cuò)誤消息。
msg_str 是一個(gè)字符串,具有可選的嵌入轉(zhuǎn)換規(guī)格。每個(gè)轉(zhuǎn)換規(guī)格都會(huì)定義參數(shù)列表中的值如何格式化并將其置于 msg_str 中轉(zhuǎn)換規(guī)格位置上的字段中。轉(zhuǎn)換規(guī)格的格式如下:
% [[flag] [width] [.?precision] [{h | l}]] type
可在 msg_str 中使用的參數(shù)包括:
flag
用于確定被替換值的間距和對(duì)齊的代碼。
| -(減號(hào)) | 左對(duì)齊 | 在給定字段寬度內(nèi)左對(duì)齊參數(shù)值。 |
| +(加號(hào)) | 符號(hào)前綴 | 如果參數(shù)值為有符號(hào)類型,則在參數(shù)值的前面加上加號(hào)(+)或減號(hào)(-)。 |
| 0(零) | 零填充 | 在達(dá)到最小寬度之前在輸出前面加上零。如果出現(xiàn) 0 和減號(hào) (-),將忽略 0。 |
| #(數(shù)字) | 對(duì) x 或 X 的十六進(jìn)制類型使用 0x 前綴 | 當(dāng)使用 o、x 或 X 格式時(shí),數(shù)字符號(hào) (#) 標(biāo)志在任何非零值的前面分別加上 0、0x 或 0X。當(dāng) d、i 或 u 的前面有數(shù)字符號(hào) (#) 標(biāo)志時(shí),將忽略該標(biāo)志。 |
| ' '(空格) | 空格填充 | 如果輸出值有符號(hào)且為正,則在該值前加空格。如果包含在加號(hào)(+)標(biāo)志中,則忽略該標(biāo)志。 |
width
定義放置參數(shù)值的字段的最小寬度的整數(shù)。如果參數(shù)值的長(zhǎng)度等于或大于 width,則打印該值,無(wú)需進(jìn)行填充。如果該值小于 width,則將該值填充到 width 中指定的長(zhǎng)度。
星號(hào) (*) 表示寬度由參數(shù)列表中的相關(guān)參數(shù)指定,該寬度必須為整數(shù)值。
precision
從字符串值的參數(shù)值中得到的最大字符數(shù)。例如,如果一個(gè)字符串具有五個(gè)字符并且精度為 3,則只使用字符串值的前三個(gè)字符。
對(duì)于整數(shù)值,precision 是指打印的最小位數(shù)。
星號(hào) (*) 表示精度由參數(shù)列表中的相關(guān)參數(shù)指定,該精度必須為整數(shù)值。
{h | l} type
與字符類型 d、i、o、x、X 或 u 一起使用,用于創(chuàng)建 shortint (h) 值或 longint (l) 值。
| d 或 i | 有符號(hào)整數(shù) |
| o | 無(wú)符號(hào)八進(jìn)制數(shù) |
| s | 字符串 |
| u | 無(wú)符號(hào)整數(shù) |
| x 或 X | 無(wú)符號(hào)十六進(jìn)制數(shù) |
請(qǐng)注意 這些類型規(guī)范基于最初為 C 標(biāo)準(zhǔn)庫(kù)中 printf 函數(shù)定義的規(guī)范。RAISERROR 消息字符串中使用的類型規(guī)范映射到 Transact-SQL 數(shù)據(jù)類型,而 printf 中使用的規(guī)范映射到 C 語(yǔ)言數(shù)據(jù)類型。當(dāng) Transact-SQL 不具有與關(guān)聯(lián) C 數(shù)據(jù)類型類似的數(shù)據(jù)類型時(shí),RAISERROR 不支持 printf 中使用的類型規(guī)范。例如,RAISERROR 不支持用于指針的 %p 規(guī)范,因?yàn)?Transact-SQL 不具有指針數(shù)據(jù)類型。
表示包含按照 msg_str 的方式格式化的字符串的任何有效字符串?dāng)?shù)據(jù)類型的變量。@local_variable 的數(shù)據(jù)類型必須為 char 或 varchar,或者必須能夠隱式轉(zhuǎn)換為這些數(shù)據(jù)類型。
用戶定義的與該消息關(guān)聯(lián)的嚴(yán)重級(jí)別。當(dāng)使用 msg_id 引發(fā)使用 sp_addmessage 創(chuàng)建的用戶定義消息時(shí),RAISERROR 上指定的嚴(yán)重性將覆蓋 sp_addmessage 中指定的嚴(yán)重性。
任何用戶都可以指定 0 到 18 之間的嚴(yán)重級(jí)別。只有 sysadmin 固定服務(wù)器角色成員或具有 ALTER TRACE 權(quán)限的用戶才能指定 19 到 25 之間的嚴(yán)重級(jí)別。若要使用 19 到 25 之間的嚴(yán)重級(jí)別,必須選擇 WITH LOG 選項(xiàng)。
| 20 到 25 之間的嚴(yán)重級(jí)別被認(rèn)為是致命的。如果遇到致命的嚴(yán)重級(jí)別,客戶端連接將在收到消息后終止,并將錯(cuò)誤記錄到錯(cuò)誤日志和應(yīng)用程序日志。 |
| 小于 0 的嚴(yán)重級(jí)別被解釋為級(jí)別為 0。大于 25 的嚴(yán)重級(jí)別被解釋為級(jí)別為 25。 |
介于 1 至 127 之間的任意整數(shù)。state 的負(fù)值默認(rèn)為 1。值為 0 或大于 127 會(huì)生成錯(cuò)誤。
如果在多個(gè)位置引發(fā)相同的用戶定義錯(cuò)誤,則針對(duì)每個(gè)位置使用唯一的狀態(tài)號(hào)有助于找到引發(fā)錯(cuò)誤的代碼段。
用于代替 msg_str 或?qū)?yīng)于 msg_id 的消息中的定義的變量的參數(shù)。可以有 0 個(gè)或多個(gè)替代參數(shù),但是替代參數(shù)的總數(shù)不能超過(guò) 20 個(gè)。每個(gè)代替參數(shù)都可以是局部變量或具有下列任一數(shù)據(jù)類型:tinyint、smallint、int、char、varchar、nchar、nvarchar、binary 或 varbinary。不支持其他數(shù)據(jù)類型。
錯(cuò)誤的自定義選項(xiàng),可以是下表中的任一值。
| LOG | 在 Microsoft SQL Server 數(shù)據(jù)庫(kù)引擎?實(shí)例的錯(cuò)誤日志和應(yīng)用程序日志中記錄錯(cuò)誤。記錄到錯(cuò)誤日志的錯(cuò)誤目前被限定為最多 440 字節(jié)。只有 sysadmin 固定服務(wù)器角色成員或具有 ALTER TRACE 權(quán)限的用戶才能指定 WITH LOG。 |
| NOWAIT | 將消息立即發(fā)送給客戶端。 |
| SETERROR | 將 @@ERROR 值和 ERROR_NUMBER 值設(shè)置為 msg_id 或 50000,不用考慮嚴(yán)重級(jí)別。 |
示例
A. 從 CATCH 塊返回錯(cuò)誤消息
下面的代碼示例顯示如何在 TRY 塊中使用 RAISERROR 使執(zhí)行跳至關(guān)聯(lián)的 CATCH 塊中。它還顯示如何使用 RAISERROR 返回有關(guān)調(diào)用 CATCH 塊的錯(cuò)誤的信息。
| BEGIN TRY-- RAISERROR with severity 11-19 will cause exeuction to -- jump to the CATCH block.RAISERROR ('Error raised in TRY block.', -- Message text.16, -- Severity.1 -- State.); END TRY BEGIN CATCHDECLARE @ErrorMessage NVARCHAR(4000);DECLARE @ErrorSeverity INT;DECLARE @ErrorState INT;SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE();-- Use RAISERROR inside the CATCH block to return error-- information about the original error that caused-- execution to jump to the CATCH block.RAISERROR (@ErrorMessage, -- Message text.@ErrorSeverity, -- Severity.@ErrorState -- State.); END CATCH; |
B. 在 sys.messages 中創(chuàng)建即席消息
以下代碼示例顯示如何引發(fā) sys.messages 目錄視圖中存儲(chǔ)的消息。該消息通過(guò) sp_addmessage 系統(tǒng)存儲(chǔ)過(guò)程,以消息號(hào) 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 |
C. 使用局部變量提供消息文本
以下代碼示例顯示如何使用局部變量為 RAISERROR 語(yǔ)句提供消息文本。
| DECLARE @StringVariable NVARCHAR(50); SET @StringVariable = N'<<%7.3s>>';RAISERROR (@StringVariable, -- Message text.10, -- Severity,1, -- State,N'abcde'); -- First argument supplies the string. -- The message text returned is: << abc>>. GO |
總結(jié)
以上是生活随笔為你收集整理的RAISERROR (Transact-SQL)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 软考中级网络工程师知识目录
- 下一篇: IntelliJ IDEA 连接数据库