2

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 からのエラーを処理する方法がある場合は、その方法を知りたいと思います。

ありがとう、

レイ

4

2 に答える 2

3

sp_send_dbmail のドキュメントを参照してください: http://msdn.microsoft.com/en-us/library/ms190307.aspx

try/catch ではなく、sp_send_dbmail からのリターン コードを使用する必要があることに注意してください。

戻りコード値


戻りコード 0 は成功を意味します。それ以外の値は失敗を意味します。失敗したステートメントのエラー コードは、@@ERRROR 変数に格納されます。

結果セット


成功すると、「Mail queued」というメッセージを返します。

于 2013-05-01T21:19:23.620 に答える
0

SQLServer 2008R2 を使用しています。私は常に戻り値として 0 を返すか、エラーを発生させます。

たとえば、存在しないプロファイルを使用すると、次のようになります。

ERROR_NUMBER() = 14607 ERROR_MESSAGE() = 'プロファイル名が無効です'

戻り値自体をチェックするよりもはるかに便利だと思います。

トメク

于 2017-02-13T12:04:01.883 に答える