gpt4 book ai didi

try-catch - 无法从 sp_send_dbmail 中捕获错误

转载 作者:行者123 更新时间:2023-12-04 05:01:29 27 4
gpt4 key购买 nike

我们使用 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) 已排队。
重码:0

电子邮件确实已发送,但消息 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 中的错误,我肯定想知道如何做。

谢谢,

最佳答案

在此处查看 sp_send_dbmail 的文档:
http://msdn.microsoft.com/en-us/library/ms190307.aspx

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

Return Code Values


A return code of 0 means success. Any other value means failure. The error code for the statement that failed is stored in the @@ERRROR variable.

Result Sets


On success, returns the message "Mail queued."

关于try-catch - 无法从 sp_send_dbmail 中捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16109138/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com