Не удается отловить ошибки из sp_send_dbmail

Мы используем sp_send_dbmail, чтобы уведомить нас о некоторых проблемах, и иногда мы прикрепляем файлы к электронным письмам. Иногда мы получаем ошибку 32 (файл используется). В этой ситуации я собрал некоторый код для отправки электронного письма без вложения, но независимо от того, что я делаю, я не могу поймать ошибку и проигнорировать ее.

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

Я попытался реализовать метод, описанный в этой статье http://www.sqlusa.com/articles2008/trycatch/ примерно так:

CREATE PROC dbo.sp_send_email
(
    @recipients         VARCHAR(100),
    @body               VARCHAR(max),
    @subject            VARCHAR(100),
    @file_attachments   VARCHAR(100)=''
)
AS
BEGIN
DECLARE @retcode INT

BEGIN TRY
    EXEC @retcode = msdb.dbo.sp_send_dbmail 
        @recipients=@recipients,
        @subject =@subject,
        @body= @body,
        @file_attachments=@file_attachments
    PRINT '@@ERROR: ' + CONVERT(VARCHAR, @@ERROR)
    PRINT 'Retcode ONE: ' + CONVERT(VARCHAR, @retcode)

    IF @retcode <> 0
        EXEC @retcode = msdb.dbo.sp_send_dbmail 
            @recipients=@recipients,
            @subject =@subject,
            @body= @body
END TRY

BEGIN CATCH
    SELECT ERROR_MESSAGE() "sp_send_dbmail: Error Description",ERROR_SEVERITY()"Error Severity"
END CATCH

RETURN @retcode

END
GO


CREATE PROCEDURE dbo.sp_test_send_email
AS
BEGIN
DECLARE @retcode INT

BEGIN TRY
    EXEC @retcode = dbo.sp_send_email @recipients='me@somewhere.com', @subject='Test Mail', @body='This is a test', @file_attachments='C:\temp\stage\test.txt'
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() "sp_test_send_email: Error Description",ERROR_SEVERITY()"Error Severity"
END CATCH

RETURN @retcode
END
GO

BEGIN TRY
    DECLARE @retcode INT
    EXEC @retcode = dbo.sp_test_send_email
    PRINT 'Retcode: ' + CONVERT(VARCHAR, @retcode)
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() "test: Error Description",ERROR_SEVERITY()"Error Severity"
END CATCH

Вот что возвращается:

Сообщение 22051, уровень 16, состояние 1, строка 0 Не удалось открыть файл вложения "C:\temp\stage\test.txt". Не удалось выполнить API "CreateFile" с ошибкой 32. @@ ОШИБКА: 0 РЕТКОД ОДИН: 1 Почта (Id: 11) поставлена ​​в очередь. Retcode: 0

Электронная почта действительно отправляется, но Msg 22051 никогда не попадает. Это то, что вызывает сбой в производстве.

Это может быть так: http://connect.microsoft.com/SQLServer/feedback/details/687544/2008-sp1-engine-sp-send-dbmail-does-not-fall-into-a-catch-block-properly

Однако, если я что-то упускаю и есть способ получить ошибки из sp_send_dbmail, я бы наверняка хотел узнать, как это сделать.

Спасибо,

луч

2 ответа

Посмотрите документацию для sp_send_dbmail здесь: http://msdn.microsoft.com/en-us/library/ms190307.aspx

Обратите внимание, что вы должны использовать код возврата от sp_send_dbmail, а не пытаться / ловить:

Значения кода возврата


Код возврата 0 означает успех. Любое другое значение означает неудачу. Код ошибки для оператора, который не удалось, хранится в переменной @@ERRROR.

Наборы результатов


В случае успеха возвращает сообщение "Почта в очереди".

Я использую SQLServer 2008R2. У меня всегда есть либо 0 в качестве возвращаемого значения, либо возникшая ошибка.

Например, когда я использую несуществующий профиль, я получаю следующее:

ERROR_NUMBER () = 14607 ERROR_MESSAGE () = 'имя профиля недействительно'

Что я считаю гораздо более полезным, чем проверка самого возвращаемого значения.

Томек

Другие вопросы по тегам