2017-05-29 8 views
0

私はcrmとerpを同期させています。私は、毎回約20のテーブルに、15分ごとに挿入するために、私たちのcrmから数百のレコードをバッチします。ある時刻に1つのレコードを挿入し、20個のテーブルのいずれかで挿入が失敗し、そのレコードの挿入を取り消した場合は、エラーを記録します。一度に1つのレコードをカーソルまたはループで挿入する方法を見ることができます。一度に1つのレコードを挿入し、トランザクションを使用してエラーを記録するにはどうすればよいですか?レコードのバッチの挿入、多くの挿入クエリー、各レコードのロギングにカーソル、ループ、トランザクションの方が適している

--transaction方法 --BEGIN TRANS

カーソル方式の

--partialコードリスト、それが動作している

declare @cur cursor; 
declare @x nvarchar(9); 
begin 
    set @cur = cursor for 
    select people_id from powercampustest.dbo.PeopleChanges where (processed is null) 

    open @cur 
    fetch next from @cur 
    into @x 

    while @@FETCH_STATUS = 0 
    begin 
     /* add the rest here */ 
     begin try 
     --20 insert queries 


     end try 

     begin catch 
      --transaction method 
      --ROLLBACK 

      print 'Error on people id ' + @x 

      --cursor method 
      --if one insert fails delete all inserted 
      --do we want error out on first fail, or try all and report if each failed or not 
      --TableListForDelete, list of tables for delete 
      --write error in log table 
     end catch 
     fetch next from @cur 
     into @x 
    end; 

    close @cur; 
    deallocate @cur; 
end; 


=========================================================== 
--partial code list of while method 

select @loop = @@rowcount 
if @loop <= 0 Return 

Set @PersonId = 0 
Select @PersonId = 
     (Select Min([PersonId]) From inserted Where [PersonId] > @PersonId) 

While @PersonId Is Not Null 
    begin 
     SELECT ... 

    --Get Next Id 
    Select @PersonId = 
      (Select Min([PersonId]) From inserted Where [PersonId] > @PersonId) 

END 


    if @@error <> 0 
    begin 
     raiserror(1944115471, 16, 65, @MessageType) with nowait; 
     rollback tran; 
    end 
end 

答えて

0

使用この:

set xact_abort on; 
begin tran 
    --all your inserts here 
commit tran 

それは全力を尽くしますエラーがなければ何もせず、何もない場合は何もしません。 カーソルは悪いですが、使用しないでください。このためにもループは必要ありません。

+0

すべてのエラーが表示されるように、各インサートを試してみたいです。一度に1つのエラーを発見するのに時間がかかります。また、私はカーソルを使って、デバッガで何が起こっているのかを確認することができます。それをトランザクションで見る方法はありますか? – ERPISE

関連する問題