2

当事务内部发生错误时,我正在尝试发送数据库邮件。我对 dbo.sp_send_dbmail 的设置是正确的,当我执行 proc 时,我确实在 1 分钟内收到了一封电子邮件。

但是,当我尝试在事务中的另一个 proc 中使用 dbo.sp_send_dbmail 时,我没有收到电子邮件。Sql server 确实在结果窗口中显示“邮件已排队”,但我从未收到它。

开始交易

声明 @err int 声明 @test nvarchar(max)

RAISERROR('这是一个测试', 16, 1) SELECT @err = @@ERROR

IF @err <> 0 开始

SET @test = error_message()

EXEC msdb.dbo.sp_send_dbmail
@recipients='mail@mail.net',@body
= 'test inside',
@subject = 'proc 错误',
@body_format = 'HTML',
@append_query_error = 1,
@profile_name ='数据库邮件配置文件';

回滚交易返回结束

提交交易

我得到的结果是

Msg 50000, Level 16, State 1, Line 7
这是一个测试
邮件队列。

4

2 回答 2

3

您将其回滚,因此它永远不会消失,将电子邮件代码放在事务之外

从网上的书

从现有事务中执行 sp_send_dbmail 时,数据库邮件依赖用户提交或回滚任何更改。它不会启动内部事务。

http://msdn.microsoft.com/en-us/library/ms190307.aspx

于 2010-06-10T19:47:25.083 回答
0

您需要创建一个保存点,尝试您的操作,如果错误回滚到保存点,发送邮件消息然后提交。类似于异常处理和嵌套事务中描述的模式。

于 2010-06-10T23:48:27.630 回答