1

我正在尝试将重复值插入到引发主键冲突错误的主键列中。我想在 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 是否是一个好习惯

4

2 回答 2

2

它确实将记录插入其中,#LogError但随后您回滚删除它的事务。

您需要在回滚后进行插入,或者改为插入表变量(不受回滚影响)。

当在 try 块中遇到错误时,这可能会使您的事务处于注定失败的状态。在执行写入日志或尝试提交的任何操作之前,您应该在 catch 块中测试XACT_STATE()参见TRY ... CATCH主题中的示例 c)的值以检查这一点。

XACT_ABORT在 try 块中任何严重性 > 10 的错误上都会产生这种效果。

于 2012-06-10T10:29:03.067 回答
1

由于 SqlServer 不支持Autonomous transaction(嵌套和独立事务),因此不可能(实际上,在某些情况下,您可以使用带有自定义连接字符串的 CLR SP - 做自己的、非本地的连接)使用数据库表来记录SP 执行活动/错误消息。

为了解决这个缺失的功能,我开发了一个工具箱(100% T-SQL),基于使用作为参考传递的XML参数(OUTPUT 参数),该参数在 SP 执行期间填充,可以保存到专用数据库表中结束。

Disclamer:我是 Iorga 的员工(联合创始人),我开发了以下 LGPL v3 工具箱。我的目标不是 Iorga/自我提升,而是分享知识和简化 T-SQL 开发人员的生活。

随心所欲地看、教、增强SPLogger

今天(2015 年 10 月 19 日)我刚刚发布了 1.3,包括基于 SPLogger的单元测试系统。

于 2015-10-07T09:33:47.627 回答