ERROR_PROCEDURE (Transact-SQL)
Devuelve el nombre del procedimiento almacenado o del desencadenador en el que se ha producido un error que ha causado la ejecución de un bloque CATCH de una construcción TRY…CATCH.
Convenciones de sintaxis de Transact-SQL
Sintaxis
ERROR_PROCEDURE ( )
Tipos de valor devueltos
nvarchar(128)
Valor devuelto
Cuando se llama en un bloque CATCH, devuelve el nombre del procedimiento almacenado en el que se ha producido el error.
Devuelve NULL si el error no se ha producido en un procedimiento almacenado o un desencadenador.
Devuelve NULL si se llama fuera del ámbito de un bloque CATCH.
Comentarios
ERROR_PROCEDURE se puede llamar en cualquier lugar dentro del ámbito de un bloque CATCH.
ERROR_PROCEDURE devuelve el nombre del procedimiento almacenado o desencadenador en el que se ha producido el error, independientemente del número de veces que se llame o del lugar desde el que se haga dentro del ámbito del bloque CATCH. Esto contrasta con las funciones, como @@ERROR, que devuelven el número de error en la instrucción inmediatamente posterior a la que ha causado el error o en la primera instrucción del bloque CATCH.
En los bloques CATCH anidados, ERROR_PROCEDURE devuelve el nombre del procedimiento almacenado o el desencadenador específico del ámbito del bloque CATCH en el que se hace referencia a él. Por ejemplo, el bloque CATCH de una construcción TRY…CATCH podría tener una TRY…CATCH anidada. En el bloque CATCH anidado, ERROR_PROCEDURE devuelve el nombre del procedimiento almacenado o el desencadenador en el que se ha producido el error y que ha llamado al bloque CATCH anidado. Si ERROR_PROCEDURE se ejecuta en el bloque CATCH externo, devuelve el nombre del procedimiento almacenado o el desencadenador en el que se ha producido el error y que ha llamado al bloque CATCH.
Ejemplos
A.Utilizar ERROR_PROCEDURE en un bloque CATCH
En el siguiente ejemplo de código se muestra un procedimiento almacenado que genera un error de división por cero. ERROR_PROCEDURE devuelve el nombre del procedimiento almacenado en el que se produce el error.
USE AdventureWorks2012;
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.Utilizar ERROR_PROCEDURE en un bloque CATCH con otras herramientas de control de errores
En el siguiente ejemplo de código se muestra un procedimiento almacenado que genera un error de división por cero. Junto al nombre del procedimiento almacenado en el que se ha producido el error, se devuelve información relacionada con dicho error.
USE AdventureWorks2012;
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