存储过程出错:无法提交当前事务,也无法支持写入日志文件的操作

her*_*ann 3 sql t-sql sql-server

错误消息是:
__CODE__

这部分就在这里导致错误(一旦我评论SELECT子句,一切运行顺利).

    DECLARE @TSV_Target_Counter INT
    DECLARE @TargetTable nvarchar(255)
    DECLARE @TargetColumn nvarchar(255)
    DECLARE @Value nvarchar(4000)
    DECLARE @SQLSTR nvarchar(4000)

    SET @TSV_Target_Counter = ( SELECT MIN(Transition_Set_Variable_ID) 
                                FROM @TSV_WithTarget )
    SET @TargetTable = ( SELECT TargetTable 
                            FROM @TSV_WithTarget
                            WHERE Transition_Set_Variable_ID = @TSV_Target_Counter )
    SET @TargetColumn = ( SELECT TargetColumn 
                            FROM @TSV_WithTarget
                            WHERE Transition_Set_Variable_ID = @TSV_Target_Counter )
    SET @Value = ( SELECT Value
                    FROM @TSV_WithTarget
                    WHERE Transition_Set_Variable_ID = @TSV_Target_Counter )

-- problem starts here

SELECT @SQLSTR = 'UPDATE Business_Partner AS BP 
                    INNER JOIN BP_Contact AS BPC ON BP.Business_Partner_ID = BPC.Business_Partner_ID 
                    INNER JOIN Due_Diligence AS DD ON BPC.BP_Contact_ID = DD.BP_Contact_ID 
                    SET' + @TargetColumn + ' = ' + @Value + ' 
                    WHERE DD.Process_Instance_ID = ' + @Process_Instance_ID

-- ends here

EXEC(@SQLSTR);
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?我试图通过此事务测试此SP:

BEGIN TRANSACTION T1
    EXEC Process_Instance_Value_AddAlter -- the name of the SP
    REVERT
ROLLBACK TRANSACTION T1
Run Code Online (Sandbox Code Playgroud)

Rem*_*anu 15

您在一个不可承受的(也称为"注定")交易的环境中运营.这意味着您没有显示更多代码,并且可能从CATCH块发出调用.请参阅不可提交的事务和XACT_STATE:

如果在TRY块中生成的错误导致当前事务的状态无效,则该事务被分类为不可提交的事务.通常在TRY块之外结束事务的错误会导致事务在TRY块内发生错误时进入不可提交状态.不可提交的事务只能执行读操作或ROLLBACK TRANSACTION.事务不能执行任何会生成写操作或COMMIT TRANSACTION的Transact-SQL语句.如果事务已被分类为不可提交的事务,则XACT_STATE函数返回值-1.批处理完成后,数据库引擎将回滚所有活动的不可提交事务.如果在事务进入不可提交状态时未发送任何错误消息,则批处理完成时,将向客户端应用程序发送错误消息.这表示检测到并回滚了不可提交的事务.

修复非常简单:不要从不可承受的事务上下文中调用该过程.始终检查XACT_STATE()CATCH块.