ERROR_STATE (Transact-SQL)

TRY...CATCH 構造の CATCH ブロックが実行された原因となるエラーの状態番号を返します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

ERROR_STATE ( )

戻り値の型

int

戻り値

CATCH ブロックの中で呼び出された場合は、CATCH ブロックが実行された原因となるエラー メッセージの状態番号を返します。

CATCH ブロックのスコープの外で呼び出された場合は、NULL を返します。

説明

一部のエラー メッセージは、Microsoft SQL Server データベース エンジンのコード内の複数の場所で生成されることがあります。たとえば、異なる複数の条件で "1105" エラーが生成されることがあります。エラーを生成するそれぞれの条件によって、一意の状態コードが割り当てられます。

Microsoft サポート技術情報などの既知の問題のデータベースを参照する際には、この状態番号を使用して、データベースに登録されている問題が、実際に発生したエラーと同じものかどうかを確認できます。たとえば、技術情報の資料で取り上げられている 1105 エラー メッセージの状態番号が 2 で、実際の 1105 エラー メッセージの状態番号が 3 だった場合、そのエラーは、その資料で報告されているものとは別の原因で発生したと考えられます。

また、SQL Server のサポート エンジニアは状態コードを使用して、エラーが発生したソース コード内の場所を探し、問題を診断することができます。

ERROR_STATE は、CATCH ブロックのスコープ内の任意の場所で呼び出すことができます。

ERROR_STATE は、実行された回数や実行される CATCH ブロックのスコープ内の場所に関係なく、エラー状態を返します。これは、@@ERROR などの関数とは対照的です。これらの関数がエラー番号を返すのは、エラーが発生したステートメントの直後のステートメントか、CATCH ブロックの最初のステートメントだけです。

入れ子になった CATCH ブロックでは、ERROR_STATE は、参照されている CATCH ブロックのスコープに固有のエラー状態を返します。たとえば、外部の TRY...CATCH 構造の CATCH ブロックには、入れ子になった TRY...CATCH 構造を含めることができます。この場合、入れ子になった CATCH ブロック内では、ERROR_STATE は、入れ子になった CATCH ブロックを呼び出したエラーの状態を返します。ERROR_STATE が外部の CATCH ブロックで実行された場合は、その CATCH ブロックを呼び出したエラーの状態が返されます。

A. CATCH ブロックで ERROR_STATE を使用する

次の例は、0 除算エラーを生成する SELECT ステートメントを示しています。エラーの状態が返されます。

USE AdventureWorks2008R2;
GO

BEGIN TRY
    -- Generate a divide by zero error
    SELECT 1/0;
END TRY
BEGIN CATCH
    SELECT ERROR_STATE() AS ErrorState;
END CATCH;
GO

B. CATCH ブロックで ERROR_STATE を他のエラー処理ツールと一緒に使用する

次の例は、0 除算エラーを生成する SELECT ステートメントを示しています。エラーの状態と共にエラーに関する情報が返されます。

USE AdventureWorks2008R2;
GO

BEGIN TRY
    -- Generate a divide-by-zero error.
    SELECT 1/0;
END TRY
BEGIN CATCH
    SELECT
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO