我有一个简单的交易,我向某些用户发送电子邮件,然后将电子邮件数据保存到表格中。
我当前的查询是这样的。
BEGIN TRANSACTION T1
BEGIN TRY
EXEC [MSDB].dbo.sp_send_dbmail @profile_name='Email Test',
@recipients='test@gmail.com',
@subject='Testing auto notification sql jobs. Please ignore',
@body_format = 'Text',
@body = 'Hello',
@query = 'some random query'
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION T1
END
ELSE
BEGIN
Update TBL_Email_Log set EmailSent = 'Y'
COMMIT TRANSACTION T1
END
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
ROLLBACK TRANSACTION T1
END CATCH
GO
当我检查电子邮件日志表时,该值设置为y。由于某种原因,该事务似乎没有回滚。
我确信,我在这里缺少一些简单的东西。
编辑:
如果查询失败,原来代码不起作用。它会处理其他错误。但是,如果查询因任何原因失败,@@ Error将返回零,并且也不会发生异常。
答案 0 :(得分:0)
最后,解决了它。事实证明,查询错误不会以@@ Error的形式返回,而是作为返回值返回。因此,声明了一个变量,将返回代码保存到该变量,然后将该变量与@@ Error一起使用。
BEGIN TRANSACTION T1
BEGIN TRY
DECLARE @ReturnCode int
EXEC @ReturnCode = [MSDB].dbo.sp_send_dbmail @profile_name='Email Test',
...
IF @@ERROR <> 0 OR @ReturnCode <> 0
BEGIN
ROLLBACK TRANSACTION T1
END
ELSE
BEGIN
Update TBL_Email_Log set EmailSent = 'Y'
COMMIT TRANSACTION T1
END
END TRY
...