我们使用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我确实想知道如何错误的方式。
谢谢,
射线