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
これはエラーが発生した場合、停止してキャッチに行くようです。そして、私はすべての挿入を試して、エラーを記録したい。だから、/ * INSERT INTO pc.dbo.People --People ... * /それがCatchに行くときにエラーが出たら、試行の終わりまで続ける方法はありますか? – ERPISE
私は答えを編集しましたが、それでもうまくいかないと確信しています。これらのログを一時テーブルに挿入してから、一時テーブルから実テーブルにロールバックしてみてください。 – PawelCz
自律型トランザクションを使用してリンクされたサーバーを設定した場合、どのように動作しますか - ループバックリンクサーバーを追加しました 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