我正在尝试在事务内部发生错误时发送数据库邮件。我对dbo.sp_send_dbmail的设置是正确的,当我执行proc时,我会在1分钟内收到一封电子邮件。
然而,当我尝试在事务中的另一个proc中使用dbo.sp_send_dbmail时,我没有收到电子邮件。 Sql server确实在结果窗口中显示“Mail quued”但我从未收到过它。
BEGIN TRANSACTION
DECLARE @err int DECLARE @test nvarchar(max)
RAISERROR('这是一个测试',16,1) SELECT @err = @@ ERROR
IF @err<> 0 BEGIN
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 ='数据库邮件配置文件';
ROLLBACK TRANSACTION 返回 结束
COMMIT TRANSACTION
我得到结果
Msg 50000,Level 16,State 1,Line 7
这是一个测试 邮件排队。
答案 0 :(得分:3)
您将其回滚,以便它永远不会消失,将电子邮件代码放在交易之外
来自在线图书
从中执行sp_send_dbmail时 在现有交易中, 数据库邮件依赖于用户 提交或回滚任何 变化。它没有开始内心 事务。
答案 1 :(得分:0)
您需要创建一个保存点,尝试操作,如果错误回滚到保存点,则发送邮件然后提交。与Exception handling and nested transactions中描述的模式类似。