不能赶上从sp_send_dbmail错误(Can't CATCH Errors from

2019-10-18 01:30发布

我们使用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 \台\ test.txt的'。 0 RETCODE酮:1个邮件(ID:11)排队的执行API '的CreateFile' 与差错数目32. @@ ERROR失败。 RETCODE: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我确实想知道如何错误的方式。

谢谢,

射线

Answer 1:

看看对sp_send_dbmail的文档在这里: http://msdn.microsoft.com/en-us/library/ms190307.aspx

请注意,你应该从sp_send_dbmail使用返回代码,而不是try / catch语句:

返回代码值


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

结果集


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



Answer 2:

我使用的SQLServer 2008R2。 我一直都为0作为返回值或引发错误。

例如,当我使用一个不存在的轮廓,我得到以下几点:

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

我考虑更多的有用的,然后检查返回值本身。

托梅克



文章来源: Can't CATCH Errors from sp_send_dbmail