2017-05-27 4 views
0

CRMからERPを更新して、新しいアカウントを追加します。挿入するレコードのバッチを持つテーブルがあります。バッチテーブルの各レコードは、新しいアカウントの約20のテーブルに挿入されます。カーソル付きのストアドプロシージャを使用しています。私はそれぞれの挿入を試してみたい、挿入が失敗した場合はすべて削除する必要があります。エラーは、テーブルに記録する必要があり、私はそれを行うスクリプトを持っています。私が心に留めているコードは以下の通りです。トランザクションがバッチテーブル内の15のレコードすべてをポストするかどうか、エラーがあればバッチ全体をロールバックするかどうかをどのように知るのですか?または、バッチから各レコードを送信し、20個の挿入がそれぞれそのバッチ・テーブル・レコードに対して成功した場合はコミットし、バッチ・テーブルのレコードにエラーがある場合は20個のトランザクションのみをロールバックします。T-SQLトランザクションバッチ全体をロールバックするか、バッチ内のエラーレコードのみをロールバックします。

OPEN @cur 
fetch next from @cur 
WHILE @@fetch_status = 0 
BEGIN 

BEGIN TRY 
BEGIN TRANSACTION 
/*INSERT INTO pc.dbo.People --People...*/ 
END TRY 

BEGIN CATCH 
error handling sp 
set error flag to a yes 

END CATCH 

BEGIN TRY 
BEGIN TRANSACTION 
/*INSERT INTO pc.dbo.PersonPhone...*/ 
END TRY 

BEGIN CATCH 
error handling sp 
set error flag to a yes 

END CATCH 

etc etc through the entire unit of work 
END 

If the error flag is No Commit, else Rollback 

FETCH NEXT FROM cur INTO @some_variables 

CLOSE cur 
DEALLOCATE cur 

答えて

0

エラーが発生した場合に挿入全体をロールバックする必要があるかどうかはほとんど分かりません。私はそれが次のようになるはずだと思います:

BEGIN TRANSACTION 
BEGIN TRY 
     OPEN @cur 
     fetch next from @cur 
     WHILE @@fetch_status = 0 
     BEGIN 
      /*INSERT INTO pc.dbo.People --People...*/ 

      /*INSERT INTO pc.dbo.PersonPhone...*/ 
     FETCH NEXT FROM cur INTO @some_variables 
      END 
     CLOSE cur 
     DEALLOCATE cur 

    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    ROLLBACK 
    -- error insert into table here 
END CATCH 

さらなる支援が必要な場合はお知らせください。

EDIT:

DECLARE @ERROR BIT = 0 
BEGIN TRANSACTION 
    OPEN @cur 
    fetch next from @cur 
    WHILE @@fetch_status = 0 
    BEGIN 

     BEGIN TRY 
      /*INSERT INTO pc.dbo.People --People...*/ 
     END TRY 
     BEGIN CATCH 
      --error handling sp 
      --set error flag to a yes 
      SET @ERROR = 1 
     END CATCH 

     BEGIN TRY 
      /*INSERT INTO pc.dbo.PersonPhone...*/ 
     END TRY 

     BEGIN CATCH 
      --error handling sp 
      --set error flag to a yes 
      SET @ERROR = 1 
     END CATCH 

     FETCH NEXT FROM cur INTO @some_variables 
    END 

    CLOSE cur 
    DEALLOCATE cur 

IF (@ERROR = 1) 
    ROLLBACK 
ELSE 
    COMMIT TRANSACTION 

このアプローチをテストしてください、それはあなたが期待している何をすべき。

+0

これはエラーが発生した場合、停止してキャッチに行くようです。そして、私はすべての挿入を試して、エラーを記録したい。だから、/ * INSERT INTO pc.dbo.People --People ... * /それがCatchに行くときにエラーが出たら、試行の終わりまで続ける方法はありますか? – ERPISE

+0

私は答えを編集しましたが、それでもうまくいかないと確信しています。これらのログを一時テーブルに挿入してから、一時テーブルから実テーブルにロールバックしてみてください。 – PawelCz

+0

自律型トランザクションを使用してリンクされたサーバーを設定した場合、どのように動作しますか - ループバックリンクサーバーを追加しました exec sp_addlinkedserver%server = N'loopback '、@ srvproduct = N' '、&provider = N'SQLNCLI11'、&datasrc = &&サーバー名; - 分散トランザクションを開始しないように設定します。 exec sp_serveroptionループバック、N'remote proc transaction promotion '、' false '; - RPCがストアドプロシージャを呼び出せるようにする exec sp_serveroptionループバック、N'rpc out '、' true ' – ERPISE

関連する問題