我正在尝试将重复值插入主键列,这会引发主键冲突错误。我想在catch块中记录此错误。
代码块: -
SET XACT_ABORT OFF
BEGIN TRY
BEGIN TRAN
INSERT INTO #Calender values (9,'Oct')
INSERT INTO #Calender values (2,'Unknown')
COMMIT TRAN
END TRY
BEGIN CATCH
Insert into #LogError values (1,'Error while inserting a duplicate value')
if @@TRANCOUNT >0
rollback tran
raiserror('Error while inserting a duplicate value ',16,20)
END CATCH
当我执行上面的代码时,它打印出自定义错误消息,该消息显示在catch块中,但不会将值插入到#LogError表中
Error while inserting a duplicate value
但是当我使用SET XACT_ABORT ON时,我收到了不同的错误消息,但仍然没有将错误消息插入表中
The current transaction cannot be committed and cannot support operations
that write to the log file. Roll back the transaction.
我的问题是
1.如何将错误记录到表中
2.当我设置xact_ABORT时,为什么会出现不同的错误消息。在每次交易之前设置XACT_ABORT是一个好习惯
答案 0 :(得分:2)
它确实将记录插入#LogError
,然后您回滚删除它的事务。
您需要在回滚后插入或插入表变量(不受回滚影响)。
如果在try块中遇到错误,这可能会使您的交易处于doomed状态。您应该在执行写入日志或尝试提交的任何内容之前测试catch块中XACT_STATE()
(see example c in the TRY ... CATCH
topic)的值以检查此值。
当XACT_ABORT
出现任何严重性错误>尝试块中的10将产生这种效果。
答案 1 :(得分:1)
由于SqlServer不支持Autonomous transaction
(嵌套和独立事务),因此不可能(事实上,在某些情况下,您可以使用带有自定义连接字符串的CLR SP - 自己做,非本地,连接)使用数据库表来记录SP执行活动/错误消息。
为了解决这个缺失的功能,我开发了一个工具箱(100%T-SQL),它基于使用 XML 参数作为参考传递(OUTPUT参数),在SP执行期间填充并且可以在最后保存到专用的数据库表中。
Disclamer:我是Iorga员工(联合创始人),我开发了以下LGPL v3工具箱。我的目标不是Iorga /自我推销,而是分享知识并简化T-SQL开发人员生活。
根据您的意愿查看,教导,增强SPLogger
今天(2015年10月19日)我刚刚发布了包含基于SPLogger的单元测试系统的1.3。