2015-04-22 2 views
1

У меня есть follwing T-sql внутри proc, вызванного с Trigger. Сам trigger запускается в другой proc и завернут в transaction.Try-Catch не работает должным образом внутри спускового крючка

IF @Email <> '' 
BEGIN 
    BEGIN TRY 
    EXEC msdb..sp_send_dbmail 
     @profile_name = @MailProfileName, 
     @recipients = @Email, 
     @subject = @Subject, 
     @body = @EmailBody, 
     @body_format = @EmailBodyFormat 
    END TRY 
    BEGIN CATCH 
    -- In future this error can be logged to message log or as an action message but ignore for now, it's due to mail profile setting. 
    --SELECT ERROR_MESSAGE() 
    END CATCH 
END 

Проблема заключается в том, что, когда @MailProfileName является значение invalid профиля затем sp_send_dbmail появлялось сообщение об ошибке, которая прекрасно до сих пор, но то, что я ожидаю от try-catch, чтобы поймать эту ошибку в catch блоке и подавить его и продолжить выполнение на следующей строке. Но что на самом деле происходит, весь процесс вылетает из-за этой ошибки.

Кто-нибудь знает, почему это происходит. Ta.

+1

Пожалуйста, не редактируйте вопрос, чтобы включить решение. Вместо этого ответьте на свой вопрос и примите ответ, чтобы люди знали, что проблема решена. –

ответ

0

Update: После небольшого поиска я пришел с этим решением:

IF @Email <> '' 
BEGIN 
    BEGIN TRY 
    Set xact_abort off 
    EXEC msdb..sp_send_dbmail 
     @profile_name = @MailProfileName, 
     @recipients = @Email, 
     @subject = @Subject, 
     @body = @EmailBody, 
     @body_format = @EmailBodyFormat 
    Set xact_abort on 
    END TRY 
    BEGIN CATCH 
    -- In future this error can be logged to message log or as an action message but ignore for now, it's due to mail profile setting. 

    --SELECT ERROR_MESSAGE() 
    END CATCH 
END 

Но будьте осторожны, чтобы не использовать эту переменную везде.

0

Чтобы ответить на конкретный вопрос «почему это происходит», когда xact_abort включен, ошибка приводит к откату всей транзакции, которая включает в себя блок try..catch, и возникает ошибка.

Смежные вопросы