ERROR_PROCEDURE (Transact-SQL)
TRY...CATCH 構造の CATCH ブロックの実行原因となったエラーが発生した、ストアド プロシージャまたはトリガーの名前を返します。
構文
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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
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
関連項目