3

エラーメッセージは次のとおりです。

現在のトランザクションはコミットできず、ログファイルに書き込む操作をサポートできません。トランザクションをロールバックします。

この部分はここでエラーを引き起こします(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);

私は何か間違ったことをしていますか?私はこのトランザクションでこのSPをテストしようとしています:

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

1 に答える 1

15

コミットできない(別名「doomed」)トランザクションのコンテキストで操作しています。これは、表示しなかったコードがさらにあり、おそらく呼び出しがCATCHブロックから発生したことを意味します。Uncommittable TransactionsおよびXACT_STATEを参照してください:

TRYブロックで生成されたエラーにより、現在のトランザクションの状態が無効になる場合、そのトランザクションはコミット不可能なトランザクションとして分類されます。通常、TRYブロックの外部でトランザクションを終了するエラーにより、TRYブロックの内部でエラーが発生すると、トランザクションはコミット不可能な状態になります。コミットできないトランザクションは、読み取り操作またはロールバックトランザクションのみを実行できます。トランザクションは、書き込み操作またはCOMMITTRANSACTIONを生成するTransact-SQLステートメントを実行できません。XACT_STATE関数は、トランザクションがコミット不可能なトランザクションとして分類されている場合、値-1を返します。バッチが終了すると、データベースエンジンはアクティブなコミットできないトランザクションをロールバックします。トランザクションがコミットできない状態に入ったときにエラーメッセージが送信されなかった場合、バッチが終了すると、エラーメッセージがクライアントアプリケーションに送信されます。これは、コミットできないトランザクションが検出され、ロールバックされたことを示します。

修正は非常に簡単です。コミットできないトランザクションコンテキストからプロシージャを呼び出さないでください。常にXACT_STATE()CATCHブロックをチェックしてください。

于 2012-12-19T10:54:04.453 に答える