避免回滚插入语句

时间:2014-06-12 21:50:16

标签: sql-server transactions rollback

我有这个SQL代码检查一些参数,如果无效会引发错误,我也想在错误表中插入错误记录。问题是,如果发生错误,整个事务将被回滚,包括错误记录,我想回滚除错误记录之外的整个事务。

我尝试创建一个单独的事务并提交它没有运气。

IF @Input IS NULL
  BEGIN
    insert into  [dbo].Errors('Field1') values ('Input is null')            
    RAISERROR ('some message', 16, 1)
    RETURN -1
  END

有没有办法在单独的事务中单独插入insert语句?

编辑:

这个存储过程是从其他过程调用的,需要进行滚动支持,即使是从外部也是如此,所以我可能需要将这个insert语句分成一个单独的事务。

1 个答案:

答案 0 :(得分:0)

您需要在单独的交易中执行此操作。如果在整个事务过程中表被锁定,则没有锁更改,但它不会影响回滚的内容。如果发生错误,则回滚整个事务。你可以添加一个“试试”吗?阻止您从中调用存储过程的代码?如果您尝试'存储过程并抛出错误,您应该捕获错误。在catch块中,您可以调用另一个存储过程来记录必要表中的错误。

听起来你遇到的问题是在哪里调用记录错误的存储过程。这可能很棘手,这一切都取决于您处理事务的方式以及捕获错误的位置。让我们假设您有代码a调用代码b和b调用第一个存储过程。现在,当存储过程抛出错误时,如果您在代码a中处理该错误,那么您在b中执行的所有操作都将回滚。如果您尝试在代码b中插入错误记录,那么它也将从代码a回滚。