2011-05-11 15 views
6

Tengo un trabajo programado a través del Agente SQL Server que ejecuta un sproc que ejecuta algunos otros sprocs. Cada sproc se ve así:¿Cómo puedo generar un error que SQL verá como un error de trabajo?

BEGIN TRY 
    -- do stuff 
END TRY 
BEGIN CATCH 
    DECLARE @errorMessage varchar(4000) 
    DECLARE @procName varchar(255) 
    SELECT @errorMessage = error_message() 
    SELECT @procName = OBJECT_NAME(@@PROCID) 

    RAISERROR('%s threw an exception: %s', 16, 1, @procName, @errorMessage) 
END CATCH 

Todo esto funciona bien - los errores son criados y arrojados por la pila, la vida es buena. Sin embargo, mis llamadas RAISERROR no parecen hacer que el trabajo falle: estoy configurado para recibir una notificación por correo electrónico "Cuando el trabajo falla", pero nunca recibo una. Las notificaciones por correo electrónico están funcionando, ya que recibiré correos electrónicos si cambio la notificación a "cuando el trabajo tenga éxito". ¿Hay alguna otra función que debería usar aquí en lugar de RAISERROR?

+0

¿Se vuelve a elevar el mensaje de error en el procedimiento de llamada almacenado? ¿Verifica el código de retorno de sus procedimientos almacenados? Puede encontrar la siguiente información útil [Error al verificar procesos almacenados anidados] (http://social.msdn.microsoft.com/Forums/en-ZA/transactsql/thread/f19be87b-93ae-472d-8be7-0f4dbe1815b2) –

+0

IMO Tim, publicar como respuesta –

Respuesta

1

Cada paso de trabajo tiene una acción por falla de paso, deben configurarse para que falle el trabajo completo. El suyo probablemente esté configurado para ir al siguiente paso solamente.

9

Levante un error en el bloque try con una gravedad entre 11-19 en el bloque TRY y luego vuelva a generar el mismo error en el bloque catch. Esto hará que el paso de fallar ..

fragmento de código de MSDN

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; 
0

Si su nivel de gravedad de error es 20 o superior, se dará por terminada la conexión de base de datos. Esto hará que el paso falle. Siempre que su paso esté configurado para que la tarea falle si el paso falla, obtendrá el resultado deseado.

RAISERROR('%s threw an exception: %s', 20, 1, @procName, @errorMessage) WITH LOG; 

véase la descripción de MSDN RAISERROR: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/raiserror-transact-sql

Cuestiones relacionadas