存储过程中的错误:当前交易不能进行,也不能支持写入日志文件的操作



错误消息是:

当前的交易不能进行,也不能支持写入日志文件的操作。回滚交易。

此部分在这里导致错误(一旦我评论选择子句,一切都顺利运行)。

    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);

我做错了什么吗?我正在尝试通过此交易来测试此SP:

BEGIN TRANSACTION T1
    EXEC Process_Instance_Value_AddAlter -- the name of the SP
    REVERT
ROLLBACK TRANSACTION T1

您正在在非马可(又名'tomed')交易的上下文中操作。这意味着您没有显示更多代码,并且可能是从捕获块中发生的。请参阅不可交易的交易和XACT_STATE:

如果在尝试块中生成的错误会导致当前事务的状态无效,则该事务被归类为不可交易的事务。通常在试验块外部结束事务的错误导致交易在尝试块内发生错误时输入不可命令的状态。不可交易的交易只能执行读取操作或回滚事务。该交易不能执行任何将生成写操作或提交事务的Transact-SQL语句。XACT_STATE函数如果事务已被归类为不可交易的事务,则返回-1的值。当批次完成时,数据库引擎会卷起任何主动的不可交易的交易。如果当交易输入不可命令的状态时未发送错误消息,则当批处理完成时,将发送错误消息到客户端应用程序。这表明检测到不可交易的交易并回滚。

修复程序非常简单:请勿从无法交易上下文中调用该过程。始终在捕获块中检查XACT_STATE()

相关内容

最新更新