Sql server 避免insert语句的回滚

Sql server 避免insert语句的回滚,sql-server,transactions,rollback,Sql Server,Transactions,Rollback,我有这段SQL代码,它检查一些参数,如果无效将引发错误,我还想在errors表中插入一条错误记录。问题是,如果发生错误,将回滚整个事务(包括错误记录),我希望回滚除错误记录之外的整个事务 我尝试创建一个单独的事务,但没有成功地提交它 IF @Input IS NULL BEGIN insert into [dbo].Errors('Field1') values ('Input is null') RAISERROR ('some message',

我有这段SQL代码,它检查一些参数,如果无效将引发错误,我还想在errors表中插入一条错误记录。问题是,如果发生错误,将回滚整个事务(包括错误记录),我希望回滚除错误记录之外的整个事务

我尝试创建一个单独的事务,但没有成功地提交它

IF @Input IS NULL
  BEGIN
    insert into  [dbo].Errors('Field1') values ('Input is null')            
    RAISERROR ('some message', 16, 1)
    RETURN -1
  END
有没有办法在单独的事务中单独隔离insert语句

编辑:


此存储过程是从其他过程调用的,需要回滚,甚至需要从外部回滚,因此我可能需要将此insert语句分离到单独的事务中。

您需要在单独的事务中执行此操作。如果表在整个事务过程中被锁定,则不会更改锁,但它不会影响回滚或不回滚的内容。如果发生错误,将回滚整个事务。能否在调用存储过程的代码中添加“try-catch”块?如果您“尝试”存储过程,但它抛出了一个错误,那么您应该捕获该错误。在catch块中,可以调用另一个存储过程,将错误记录在必要的表中

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