使用sql server中的try和catch块记录自定义错误消息

时间:2012-06-10 10:08:06

标签: sql-server

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

2 个答案:

答案 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。