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 Mail (Id: 11) queued。转码:0

电子邮件确实已发送,但 Msg 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

请注意,您应该使用 sp_send_dbmail 的返回码,而不是 try/catch:

返回代码值


返回码 0 表示成功。任何其他值都意味着失败。失败语句的错误代码存储在@@ERRROR 变量中。

结果集


成功时,返回消息“邮件排队”。

于 2013-05-01T21:19:23.620 回答
0

我使用 SQLServer 2008R2。我总是将 0 作为返回值或引发错误。

例如,当我使用不存在的配置文件时,我将获得以下信息:

ERROR_NUMBER() = 14607 ERROR_MESSAGE() = '配置文件名称无效'

我认为这比检查返回值本身更有用。

托梅克

于 2017-02-13T12:04:01.883 回答