当xact_abort为ON时,如何在SQL事务中获取实际异常

时间:2014-10-23 17:55:24

标签: sql sql-server transactions sql-server-2012 try-catch

使用xact_abort ON

时,如何保留/检索错误状态或返回实际错误?

目前,当我使用已启动的外部事务来执行此存储过程时。

begin tran
exec TestFK 2

我得到这个隐藏实际错误的通用错误

  

当前事务无法提交,也无法支持写入日志文件的操作。回滚交易。

但是当我没有外部交易时执行

exec TestFK 2

我得到了正确的错误。

  

INSERT语句与FOREIGN KEY约束冲突" FK__t2__a__3B783965"。冲突发生在数据库" XXX",表" dbo.t1",列' a'。

Setup Code

ALTER procedure [dbo].[TestFK]
@Id int
as
begin
    SET NOCOUNT ON        
    SET xact_abort ON  
    DECLARE @trancount INT
    SET @trancount = @@TRANCOUNT 
    begin try

        IF @trancount = 0 
            BEGIN TRANSACTION

            INSERT INTO t2 VALUES (@Id); -- Foreign key error for @Id = 2

        IF @trancount = 0 
           COMMIT TRANSACTION 
    end try
    begin catch 
      IF Xact_state() <> 0 AND @trancount = 0 
        ROLLBACK TRANSACTION 

      Exec uspInsErrorInfo -- Here I want to preserve the Error State somehow       
    end catch
END

CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2 (a INT NOT NULL REFERENCES t1(a));

INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (6);

1 个答案:

答案 0 :(得分:0)

因此,我使用的解决方案是在这种情况下简单地删除try / catch块。

Since

  

当SET XACT_ABORT为ON时,如果Transact-SQL语句引发了   运行时错误,整个事务终止并回滚。

ALTER procedure [dbo].[TestFK]
@Id int
as
begin
    SET NOCOUNT ON        
    SET xact_abort ON  
    DECLARE @trancount INT
    SET @trancount = @@TRANCOUNT 

        IF @trancount = 0 
            BEGIN TRANSACTION

            INSERT INTO t2 VALUES (@Id); -- Foreign key error for @Id = 2
            -- + some other statements
        IF @trancount = 0 
           COMMIT TRANSACTION 
END