2016-08-18 5 views
3

私は非常に巨大なSPを持っており、トランザクションがあります。私はSPでアルゴリズムを実行しており、アルゴリズムが成功しなかった場合、トランザクションはロールバックされます。特定のINSERT文がトランザクション内でロールバックされないようにする方法

トランザクションがロールバックされてもデータをロギングする必要がありますが、トランザクションがロールバックされるとログもロールバックされます。これは正常な動作ですが、トランザクションがまだログに記録されるように、ロールバックからそのログ挿入ステートメントを除外する必要があります。

私は#MissingAllocationLinesと呼ばれる一時テーブルを持っており、私はそのテーブルに自分のログを挿入します。ロールバックすると、#MissingAllocationLinesから実際のテーブルにすべての行を挿入する必要がありますDLWMS_ALLOCATIONMISSINGLOG

これは可能ですか?私のサンプルコードは以下の通りです

create table #MissingAllocationLines 
(ALLOCATIONJOBID BIGINT, 
ORDERID BIGINT, 
ORDERDETAILID BIGINT, 
ITEMID BIGINT, 
STOCKQUANTITY BIGINT, 
ORDERQUANTITY BIGINT) 


BEGIN TRANSACTION 

WHILE(.....) 
BEGIN 
    INSERT INTO #MissingAllocationLines (ALLOCATIONJOBID,ORDERID,ORDERDETAILID,ITEMID,STOCKQUANTITY,ORDERQUANTITY) 
    VALUES (@ALLOCATIONJOBID,@OrderID,@OrderDetailID,@ItemID,ISNULL(@StockFreeQuantity, 0),ISNULL(@RemainingQuantity,0)) 
    ... 
    ... 
    ... 
END 

IF(@DONE=1) 
BEGIN 
    COMMIT TRANSACTION 
END 
ELSE 
BEGIN 
    ROLLBACK TRANSCATION 

    INSERT INTO DLWMS_ALLOCATIONMISSINGLOG (ALLOCATIONJOBID,ORDERID,ORDERDETAILID,ITEMID,STOCKQUANTITY,ORDERQUANTITY) 
    SELECT ALLOCATIONJOBID,ORDERID,ORDERDETAILID,ITEMID,STOCKQUANTITY,ORDERQUANTITY 
    FROM #MissingAllocationLines 
END 
+1

Oracleには、これに使用できる「自律型トランザクション」と呼ばれるものがあります。 SQL Serverに類似したものがあるかどうかはわかりません。 – Mat

答えて

0

SAVE TRANSACTIONコマンドをチェックしてください。トランザクションをロールバックする前に、次の操作を行い、catchブロックで

begin tran outertran 
insert into t values (1) 
begin tran innertran 
insert into localserver.tempdb.#log values (1) 
commit tran innertran 
IF (@Done) 
begin 
    commit tran outertran 
end 
else begin 
rollback tran outertran 
end 

select * from #log 

EXEC sp_addlinkedserver @server = N'localserver',@srvproduct = N'',@provider = N'SQLNCLI', @datasrc = @@SERVERNAME 
EXEC sp_serveroption localserver,N'remote proc transaction promotion','FALSE' 
EXEC sp_serveroption localserver,N'RPC OUT','TRUE' -- Enable RPC to the given server 
0

あなたは偽とローカルサーバーへのリンクサーバーを使用してログインしないと「リモートプロシージャ・トランザクションプロモーション」を使用することができます。 ..

DECLARE @TABLE AS TABLE 
    (COL1 INT, 
    COL2 INT 
    ... 
    ) 
    INSERT INTO @TABLE 
    SELECT * FROM #TEMP TABLE 

    ROLLBACK TRANSCATION 

    INSERT INTO DLWMS_ALLOCATIONMISSINGLOG 
    select * from @table 

参考文献:
http://sqlmag.com/t-sql/table-variable-tip

関連する問題