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 で失敗しました。 @@ERROR: 0 Retcode ONE: 1 メール (Id: 11) がキューに入れられました。再コード: 0
電子メールは送信されますが、メッセージ 22051 は決してキャッチされません。これが生産上の失敗の原因です。
これはその通りかもしれません: http://connect.microsoft.com/SQLServer/feedback/details/687544/2008-sp1-engine-sp-send-dbmail-does-not-fall-into-a-catch-ブロック-適切に
ただし、何か不足していて、sp_send_dbmail からのエラーを処理する方法がある場合は、その方法を知りたいと思います。
ありがとう、
レイ