Не удается отловить ошибки из 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 () = 'имя профиля недействительно'
Что я считаю гораздо более полезным, чем проверка самого возвращаемого значения.
Томек