次の方法で共有


ERROR_PROCEDURE (Transact-SQL)

TRY...CATCH 構造の CATCH ブロックの実行原因となったエラーが発生した、ストアド プロシージャまたはトリガの名前を返します。

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

構文

ERROR_PROCEDURE ( )

戻り値の型

nvarchar(126)

戻り値

CATCH ブロックで呼び出された場合、エラーが発生したストアド プロシージャ名を返します。

ストアド プロシージャまたはトリガ内でエラーが発生しなかった場合は NULL を返します。

CATCH ブロックの範囲外で呼び出された場合は NULL を返します。

説明

ERROR_PROCEDURE は、CATCH ブロックのスコープ内であればどこでも呼び出すことができます。

ERROR_PROCEDURE は、呼び出される回数や CATCH ブロックのスコープのどこで呼び出されるかに関係なく、エラーが発生したストアド プロシージャまたはトリガの名前を返します。これは @@ERROR のような関数とは対称的です。@@ERROR 関数では、エラーの発生元となるステートメントの直後にあるステートメント、または CATCH ブロックの最初のステートメントのエラー番号が返されます。

入れ子にされた CATCH ブロックを使用すると、ERROR_PROCEDURE では、参照される CATCH ブロックのスコープに固有のストアド プロシージャまたはトリガの名前が返されます。たとえば、TRY...CATCH 構造の CATCH ブロックには、TRY...CATCH が入れ子にされている場合があり、入れ子にされた CATCH ブロック内では、ERROR_PROCEDURE によって、入れ子にされた CATCH ブロックを起動した、エラーの発生元となるストアド プロシージャまたはトリガの名前が返されます。ERROR_PROCEDURE が外側の CATCH ブロックで実行された場合は、外側の CATCH ブロックを起動した、エラーの発生元となるストアド プロシージャまたはトリガの名前が返されます。

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

次の例では、0 除算エラーを生成したストアド プロシージャを示します。ERROR_PROCEDURE ではエラーが発生したストアド プロシージャの名前が返されます。

USE AdventureWorks;
GO

-- Verify that the stored procedure does not already exist.
IF OBJECT_ID ( 'usp_ExampleProc', 'P' ) IS NOT NULL 
    DROP PROCEDURE usp_ExampleProc;
GO

-- Create a stored procedure that 
-- generates a divide-by-zero error.
CREATE PROCEDURE usp_ExampleProc
AS
    SELECT 1/0;
GO

BEGIN TRY
    -- Execute the stored procedure inside the TRY block.
    EXECUTE usp_ExampleProc;
END TRY
BEGIN CATCH
    SELECT ERROR_PROCEDURE() AS ErrorProcedure;
END CATCH;
GO

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

次の例では、0 除算エラーを生成したストアド プロシージャを示します。ここではエラー発生元のストアド プロシージャの名前と共に、エラーに関連する情報が返されます。

USE AdventureWorks;
GO

-- Verify that the stored procedure does not already exist.
IF OBJECT_ID ( 'usp_ExampleProc', 'P' ) IS NOT NULL 
    DROP PROCEDURE usp_ExampleProc;
GO

-- Create a stored procedure that 
-- generates a divide-by-zero error.
CREATE PROCEDURE usp_ExampleProc
AS
    SELECT 1/0;
GO

BEGIN TRY
    -- Execute the stored procedure inside the TRY block.
    EXECUTE usp_ExampleProc;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_MESSAGE() AS ErrorMessage,
        ERROR_LINE() AS ErrorLine;
        END CATCH;
GO