RAISERROR (Transact-SQL)RAISERROR (Transact-SQL)

適用対象: ○SQL Server ○Azure SQL Database ○Azure SQL Data Warehouse ○Parallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

エラー メッセージを生成し、セッションのエラー処理を開始します。Generates an error message and initiates error processing for the session. RAISERROR では、sys.messages カタログ ビューに格納されているユーザー定義のメッセージを参照することも、メッセージを動的に作成することもできます。RAISERROR can either reference a user-defined message stored in the sys.messages catalog view or build a message dynamically. メッセージは、サーバー エラー メッセージとして、呼び出し元のアプリケーションまたは関連する TRY...CATCH 構造の CATCH ブロックに返されます。The message is returned as a server error message to the calling application or to an associated CATCH block of a TRY...CATCH construct. 新しいアプリケーションでは、代わりに THROW を使用してください。New applications should use THROW instead.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

-- Syntax for SQL Server and Azure SQL Database  
  
RAISERROR ( { msg_id | msg_str | @local_variable }  
    { ,severity ,state }  
    [ ,argument [ ,...n ] ] )  
    [ WITH option [ ,...n ] ]  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
RAISERROR ( { msg_str | @local_variable }  
    { ,severity ,state }  
    [ ,argument [ ,...n ] ] )  
    [ WITH option [ ,...n ] ]  

引数Arguments

msg_idmsg_id
sp_addmessage を使用して sys.messages カタログ ビューに格納されたユーザー定義エラー メッセージ番号です。Is a user-defined error message number stored in the sys.messages catalog view using sp_addmessage. ユーザー定義エラー メッセージのエラー番号は、必ず 50000 より大きくなります。Error numbers for user-defined error messages should be greater than 50000. msg_id を指定しないと、RAISERROR はエラー番号 50000 のエラー メッセージを表示します。When msg_id is not specified, RAISERROR raises an error message with an error number of 50000.

msg_strmsg_str
C 標準ライブラリに含まれる printf 関数に似た形式のユーザー定義メッセージです。Is a user-defined message with formatting similar to the printf function in the C standard library. エラー メッセージの長さは最大 2,047 文字です。The error message can have a maximum of 2,047 characters. メッセージの文字数が 2,048 文字を超えると、2,044 文字までだけ表示され、メッセージが途中で切れていることを示す省略記号が追加されます。If the message contains 2,048 or more characters, only the first 2,044 are displayed and an ellipsis is added to indicate that the message has been truncated. 内部的な記憶動作が原因で、書式引数は出力として表示されるより多くの文字を使用することに注意してください。Note that substitution parameters consume more characters than the output shows because of internal storage behavior. たとえば、2 という値が割り当てられる書式引数 %d は、実際にメッセージ文字列に表示されるのは 1 文字ですが、内部的にはさらに 3 文字分の記憶領域を必要とします。For example, the substitution parameter of %d with an assigned value of 2 actually produces one character in the message string but also internally takes up three additional characters of storage. この記憶領域の要件により、メッセージ出力で使用できる文字数は少なくなります。This storage requirement decreases the number of available characters for message output.

msg_str を指定した場合、RAISERROR はエラー番号 50000 のエラー メッセージを表示します。When msg_str is specified, RAISERROR raises an error message with an error number of 50000.

msg_str は、オプションで変換指定が埋め込まれた文字列です。msg_str is a string of characters with optional embedded conversion specifications. それぞれの変換指定で、引数リストの値をどのような形式にするかと、msg_str 内の変換指定の場所にあるフィールドにどのように配置するのかを定義します。Each conversion specification defines how a value in the argument list is formatted and placed into a field at the location of the conversion specification in msg_str. 変換指定の形式は、次のとおりです。Conversion specifications have this format:

% [[flag] [width] [.% [[flag] [width] [. precision] [{h | l}]] typeprecision] [{h | l}]] type

msg_str では、次のパラメーターを使用します。The parameters that can be used in msg_str are:

flagflag

置換された値の間隔と配置を決めるコードです。Is a code that determines the spacing and justification of the substituted value.

コードCode プレフィックスまたは配置Prefix or justification [説明]Description
- (マイナス)- (minus) 左寄せLeft-justified 指定されたフィールド幅内で引数の値を左寄せします。Left-justify the argument value within the given field width.
+ (プラス)+ (plus) 符号プレフィックスSign prefix 引数の値が符号付きの場合に、プラス記号 (+) またはマイナス記号 (-) を先頭に付けます。Preface the argument value with a plus (+) or minus (-) if the value is of a signed type.
0 (ゼロ)0 (zero) 0 埋めZero padding 幅の最小値になるまで、出力の先頭に 0 を付けます。Preface the output with zeros until the minimum width is reached. 0 とマイナス記号 (-) が付いている場合は、0 は無視されます。When 0 and the minus sign (-) appear, 0 is ignored.
# (番号)# (number) 16 進型の x または X に対する 0x プレフィックス0x prefix for hexadecimal type of x or X 番号記号 (#) フラグは、o、x、または X 形式で使われる場合、0 以外の値の先頭に、それぞれ 0、0x、0X を付けます。When used with the o, x, or X format, the number sign (#) flag prefaces any nonzero value with 0, 0x, or 0X, respectively. d、i、または u に番号記号 (#) フラグが付いている場合、フラグは無視されます。When d, i, or u are prefaced by the number sign (#) flag, the flag is ignored.
' ' (空白)' ' (blank) スペース埋めSpace padding 出力値が符号付きで正の値の場合に、先頭に空白を付けます。Preface the output value with blank spaces if the value is signed and positive. プラス記号 (+) フラグが指定される場合は、この空白は無視されます。This is ignored when included with the plus sign (+) flag.

widthwidth

引数値が配置されるフィールドの幅の最小値を定義する整数です。Is an integer that defines the minimum width for the field into which the argument value is placed. 引数値の長さが width 以上の場合、値は埋め込みなしで出力されます。If the length of the argument value is equal to or longer than width, the value is printed with no padding. 値が width より短い場合は、width で指定した長さまで埋め込まれます。If the value is shorter than width, the value is padded to the length specified in width.

アスタリスク (*) は、width が引数リスト内の関連する引数によって指定されることを意味します。この引数は整数値である必要があります。An asterisk (*) means that the width is specified by the associated argument in the argument list, which must be an integer value.

有効桁数 (precision)precision

文字列の値の引数値から取得される最大文字数です。Is the maximum number of characters taken from the argument value for string values. たとえば、文字列が 5 文字で、precision が 3 の場合、文字列の値の最初の 3 文字のみが使用されます。For example, if a string has five characters and precision is 3, only the first three characters of the string value are used.

整数値の場合、precision は出力される最小桁数です。For integer values, precision is the minimum number of digits printed.

アスタリスク (*) は、precision が引数のリスト内の関連する引数により指定されることを意味します。この引数は整数値である必要があります。An asterisk (*) means that the precision is specified by the associated argument in the argument list, which must be an integer value.

{h | l} type{h | l} type

d、i、o、s、x、X、u の各文字型で使われ、shortint (h) または longint (l) の値を作成します。Is used with character types d, i, o, s, x, X, or u, and creates shortint (h) or longint (l) values.

型の指定Type specification 表す内容Represents
d または id or i 符号付き整数Signed integer
oo 符号なし 8 進数Unsigned octal
ss StringString
uu 符号なし整数Unsigned integer
x または Xx or X 符号なし 16 進数Unsigned hexadecimal

注意

これらの型指定は、C 標準ライブラリの printf 関数に対して定義されている型指定に基づいています。These type specifications are based on the ones originally defined for the printf function in the C standard library. RAISERROR メッセージ文字列に使用される型指定は Transact-SQLTransact-SQL のデータ型にマップされ、printf で使用される型指定は C 言語のデータ型にマップされます。The type specifications used in RAISERROR message strings map to Transact-SQLTransact-SQL data types, while the specifications used in printf map to C language data types. printf で使用される型指定は、関連する C のデータ型に類似するデータ型が Transact-SQLTransact-SQL にない場合、RAISERROR でサポートされません。Type specifications used in printf are not supported by RAISERROR when Transact-SQLTransact-SQL does not have a data type similar to the associated C data type. たとえば、ポインターに対する %p 指定は、Transact-SQLTransact-SQL にポインターのデータ型がないため、RAISERROR でサポートされません。For example, the %p specification for pointers is not supported in RAISERROR because Transact-SQLTransact-SQL does not have a pointer data type.

注意

Transact-SQLTransact-SQL bigint データ型に値を変換するには、 %I64d を指定します。To convert a value to the Transact-SQLTransact-SQL bigint data type, specify %I64d.

@local_variable*
msg_str と同じ形式の文字列を含む有効な文字データ型の変数です。Is a variable of any valid character data type that contains a string formatted in the same manner as msg_str.
@local_variable* のデータ型は char または varchar であるか、これらのデータ型に暗黙的に変換できるデータ型である必要があります。*@local_variable* must be char or varchar, or be able to be implicitly converted to these data types.

severityseverity
このメッセージに関連付けられたユーザー定義重大度レベルです。Is the user-defined severity level associated with this message. sp_addmessage を使用して作成されたユーザー定義メッセージを、msg_id を使用して出力するときは、RAISERROR で指定された重大度が sp_addmessage で指定された重大度をオーバーライドします。When using msg_id to raise a user-defined message created using sp_addmessage, the severity specified on RAISERROR overrides the severity specified in sp_addmessage.

0 から 18 までの重大度レベルはどのユーザーでも指定できます。Severity levels from 0 through 18 can be specified by any user. 19 から 25 までの重大度レベルは、固定サーバー ロールまたはユーザー ALTER TRACE 権限を持つ、sysadmin のメンバーのみが指定できます。Severity levels from 19 through 25 can only be specified by members of the sysadmin fixed server role or users with ALTER TRACE permissions. 重大度レベル 19 から 25 までは、WITH LOG オプションを必要とします。For severity levels from 19 through 25, the WITH LOG option is required. 0 より小さい重大度レベルは 0 と解釈されます。Severity levels less than 0 are interpreted as 0. 25 より大きい重大度レベルは 25 と解釈されます。Severity levels greater than 25 are interpreted as 25.

注意事項

重大度レベル 20 から 25 までは、致命的と見なされます。Severity levels from 20 through 25 are considered fatal. この致命的な重大度レベルが発生した場合は、メッセージを受け取った後でクライアントの接続が終了し、エラーがエラー ログおよびアプリケーション ログに記録されます。If a fatal severity level is encountered, the client connection is terminated after receiving the message, and the error is logged in the error and application logs.

次の例に示すように、エラーに関連付けられた重大度の値を返すには -1 を指定できます。You can specify -1 to return the severity value associated with the error as shown in the following example.

RAISERROR (15600,-1,-1, 'mysp_CreateCustomer');  

以下に結果セットを示します。Here is the result set.

Msg 15600, Level 15, State 1, Line 1   
An invalid parameter or option was specified for procedure 'mysp_CreateCustomer'.

statestate
0 から 255 までの整数です。Is an integer from 0 through 255. 負の値は既定で 1 に設定されます。Negative values default to 1. 255 より大きい値は使用できません。Values larger than 255 should not be used.

同じユーザー定義エラーが複数の場所で発生する場合、それぞれの場所に対して一意の状態番号を使用すると、コードのどのセクションでエラーが発生しているのかを楽に探すことができます。If the same user-defined error is raised at multiple locations, using a unique state number for each location can help find which section of code is raising the errors.

argumentargument
msg_str で定義された変数、または msg_id に対応するメッセージの書式引数に使用されるパラメーターです。Are the parameters used in the substitution for variables defined in msg_str or the message corresponding to msg_id. 書式引数は指定しなくても、複数指定してもかまいませんが、合計で 20 を超えることはできません。There can be 0 or more substitution parameters, but the total number of substitution parameters cannot exceed 20. 書式引数にはローカル変数を指定するか、データ型として tinyintsmallintintcharvarcharncharnvarcharbinaryvarbinary のいずれかを指定できます。Each substitution parameter can be a local variable or any of these data types: tinyint, smallint, int, char, varchar, nchar, nvarchar, binary, or varbinary. その他のデータ型はサポートされません。No other data types are supported.

オプションoption
エラーのカスタム オプションです。次の表のいずれかの値をとります。Is a custom option for the error and can be one of the values in the following table.

[値]Value [説明]Description
LOGLOG MicrosoftMicrosoft SQL ServerSQL Server データベース エンジンDatabase Engineのインスタンスについて、エラー ログとアプリケーション ログにエラーを記録します。Logs the error in the error log and the application log for the instance of the MicrosoftMicrosoft SQL ServerSQL Server データベース エンジンDatabase Engine. エラー ログに記録されるエラーは、現在、最高 440 バイトに制限されています。Errors logged in the error log are currently limited to a maximum of 440 bytes. sysadmin 固定サーバー ロールまたは ALTER TRACE 権限を持つユーザーのメンバーのみが WITH LOG を指定できます。Only a member of the sysadmin fixed server role or a user with ALTER TRACE permissions can specify WITH LOG.

適用対象:Applies to: SQL ServerSQL Server, SQL DatabaseSQL DatabaseSQL ServerSQL Server, SQL DatabaseSQL Database
NOWAITNOWAIT クライアントにすぐにメッセージを送信します。Sends messages immediately to the client.

適用対象:Applies to: SQL ServerSQL Server, SQL DatabaseSQL DatabaseSQL ServerSQL Server, SQL DatabaseSQL Database
SETERRORSETERROR 重大度レベルとは無関係に、@@ERROR 値と ERROR_NUMBER 値に msg_id または 50000 を設定します。Sets the @@ERROR and ERROR_NUMBER values to msg_id or 50000, regardless of the severity level.

適用対象:Applies to: SQL ServerSQL Server, SQL DatabaseSQL DatabaseSQL ServerSQL Server, SQL DatabaseSQL Database

RemarksRemarks

RAISERROR によって生成されたエラーは、データベース エンジンDatabase Engineのコードによって生成されたエラーと同様に機能します。The errors generated by RAISERROR operate the same as errors generated by the データベース エンジンDatabase Engine code. RAISERROR によって指定された値は、ERROR_LINE、ERROR_MESSAGE、ERROR_NUMBER、ERROR_PROCEDURE、ERROR_SEVERITY、ERROR_STATE、@@ERROR システム関数によりレポートされます。The values specified by RAISERROR are reported by the ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY, ERROR_STATE, and @@ERROR system functions. TRY ブロックで 11 以上の重大度で RAISERROR を実行すると、RAISERROR から、関連する CATCH ブロックに制御が渡されます。When RAISERROR is run with a severity of 11 or higher in a TRY block, it transfers control to the associated CATCH block. RAISERROR が次の条件で実行されると、呼び出し元にエラーが返されます。The error is returned to the caller if RAISERROR is run:

  • TRY ブロックのスコープの外で実行された場合Outside the scope of any TRY block.

  • TRY ブロックで 10 以下の重大度で実行された場合With a severity of 10 or lower in a TRY block.

  • データベース接続を終了させる 20 以上の重大度で実行された場合With a severity of 20 or higher that terminates the database connection.

CATCH ブロックは、ERROR_NUMBER や ERROR_MESSAGE などのシステム関数を使用して CATCH ブロックを呼び出したエラーを、RAISERROR を使用して再度スローし、元のエラー情報を取得できます。CATCH blocks can use RAISERROR to rethrow the error that invoked the CATCH block by using system functions such as ERROR_NUMBER and ERROR_MESSAGE to retrieve the original error information. 重大度レベルが 1 から 10 までのメッセージには、@@ERROR の値は既定で 0 に設定されます。@@ERROR is set to 0 by default for messages with a severity from 1 through 10.

msg_id で sys.messages カタログ ビューから利用可能なユーザー定義メッセージを指定している場合、RAISERROR は、msg_str を使用して指定されたユーザー定義メッセージのテキストに適用されているのと同じルールで、テキスト列からのメッセージを処理します。When msg_id specifies a user-defined message available from the sys.messages catalog view, RAISERROR processes the message from the text column using the same rules as are applied to the text of a user-defined message specified using msg_str. ユーザー定義メッセージのテキストには変換指定を含めることができます。その変換指定には RAISERROR によって引数値がマップされます。The user-defined message text can contain conversion specifications, and RAISERROR will map argument values into the conversion specifications. ユーザー定義エラー メッセージを追加するには sp_addmessage を使用し、ユーザー定義エラー メッセージを削除するには sp_dropmessage を使用します。Use sp_addmessage to add user-defined error messages and sp_dropmessage to delete user-defined error messages.

RAISERROR は、呼び出し元のアプリケーションにメッセージを返すために、PRINT の代わりに使用することができます。RAISERROR can be used as an alternative to PRINT to return messages to calling applications. RAISERROR では C 標準ライブラリの printf 関数の機能に類似した代替文字をサポートしますが、Transact-SQLTransact-SQL の PRINT ステートメントではサポートしていません。RAISERROR supports character substitution similar to the functionality of the printf function in the C standard library, while the Transact-SQLTransact-SQL PRINT statement does not. RAISERROR が TRY ブロック内で 11 から 19 の重大度で実行され、関連する CATCH ブロックに制御を渡す間、PRINT ステートメントは TRY ブロックの影響を受けません。The PRINT statement is not affected by TRY blocks, while a RAISERROR run with a severity of 11 to 19 in a TRY block transfers control to the associated CATCH block. CATCH ブロックを呼び出さずに TRY ブロックからのメッセージを返すには、重大度を 10 以下に指定して RAISERROR を使用します。Specify a severity of 10 or lower to use RAISERROR to return a message from a TRY block without invoking the CATCH block.

通常、最初の引数が最初の変換指定を置き換え、2 番目の引数が 2 番目の変換指定を置き換えるというように、連続する引数が連続する変換指定を置き換えます。Typically, successive arguments replace successive conversion specifications; the first argument replaces the first conversion specification, the second argument replaces the second conversion specification, and so on. たとえば、次の RAISERROR ステートメントは、最初の引数 N'number' で最初の変換指定 %s を置き換え、2 番目の引数 5 で 2 番目の変換指定 %d. を置き換えます。For example, in the following RAISERROR statement, the first argument of N'number' replaces the first conversion specification of %s; and the second argument of 5 replaces the second conversion specification of %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  

変換指定の width または precision にアスタリスク (*) が指定されている場合、width または precision に使用される値は整数の引数値として指定されます。If an asterisk (*) is specified for either the width or precision of a conversion specification, the value to be used for the width or precision is specified as an integer argument value. この場合、1 つの変換指定で、width、precision、および置換値に対して 1 つずつ、最大 3 つまでの引数を使用できます。In this case, one conversion specification can use up to three arguments, one each for the width, precision, and substitution value.

たとえば、次の RAISERROR ステートメントはどちらも同じ文字列を返します。For example, both of the following RAISERROR statements return the same string. 一方のステートメントでは引数リストで width と precision の値を指定し、もう一方のステートメントでは変換指定でこれらを指定しています。One specifies the width and precision values in the argument list; the other specifies them in the conversion specification.

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  

使用例Examples

A.A. CATCH ブロックからエラー情報を返すReturning error information from a CATCH block

次のコード例では、TRY ブロック内で RAISERROR を使用して、関連付けられている CATCH ブロックに実行を移動させる方法を示します。The following code example shows how to use RAISERROR inside a TRY block to cause execution to jump to the associated CATCH block. また、RAISERROR を使用して、CATCH ブロックを呼び出したエラーについての情報を返す方法も示しています。It also shows how to use RAISERROR to return information about the error that invoked the CATCH block.

注意

RAISERROR では、1 から 127 までの状態番号のエラーだけが生成されます。RAISERROR only generates errors with state from 1 through 127. データベース エンジンDatabase Engineでは状態番号 0 のエラーが発生する場合があるため、ERROR_STATE によって返されるエラーの状態番号は、RAISERROR の state パラメーターの値として渡す前に確認することをお勧めします。Because the データベース エンジンDatabase Engine may raise errors with state 0, we recommend that you check the error state returned by ERROR_STATE before passing it as a value to the state parameter of RAISERROR.

BEGIN TRY  
    -- RAISERROR with severity 11-19 will cause execution to   
    -- jump to the CATCH block.  
    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();  
  
    -- 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.B. sys.messages 内でアドホック メッセージを作成するCreating an ad hoc message in sys.messages

次の例では、sys.messages カタログ ビューに格納されているメッセージが生成される方法を示します。The following example shows how to raise a message stored in the sys.messages catalog view. メッセージは、sp_addmessage システム ストアド プロシージャを使用して、メッセージ番号 50005 として sys.messages カタログ ビューに追加されています。The message was added to the sys.messages catalog view by using the sp_addmessage system stored procedure as message number 50005.

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.C. ローカル変数を使用してメッセージ テキストを指定するUsing a local variable to supply the message text

次のコード例では、ローカル変数を使用して、RAISERROR ステートメントのメッセージ テキストを指定する方法を示します。The following code example shows how to use a local variable to supply the message text for a RAISERROR statement.

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  

参照See Also

組み込み関数 (Transact-SQL) Built-in Functions (Transact-SQL)
DECLARE @local_variable (Transact-SQL) DECLARE @local_variable (Transact-SQL)
PRINT (Transact-SQL) PRINT (Transact-SQL)
sp_addmessage (Transact-SQL) sp_addmessage (Transact-SQL)
sp_dropmessage (Transact-SQL) sp_dropmessage (Transact-SQL)
sys.messages (Transact-SQL) sys.messages (Transact-SQL)
xp_logevent (Transact-SQL) xp_logevent (Transact-SQL)
@@ERROR (Transact-SQL) @@ERROR (Transact-SQL)
ERROR_LINE (Transact-SQL) ERROR_LINE (Transact-SQL)
ERROR_MESSAGE (Transact-SQL) ERROR_MESSAGE (Transact-SQL)
ERROR_NUMBER (Transact-SQL) ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE (Transact-SQL) ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY (Transact-SQL) ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL) ERROR_STATE (Transact-SQL)
TRY...CATCH (Transact-SQL)TRY...CATCH (Transact-SQL)