2016-07-20 2 views
0

1つのテーブルtableAからtableBにデータをプッシュする必要があります。今私は、後述するようにこれを行うには、単純な挿入スクリプトを使用しています -SQL Server 2012の別のテーブルにエラー行を挿入できます

にtableA

から(COL1、COL2) セレクトCOL1、COL2 今すぐTableBののcol1が主キーであるTABLEB に挿入します。エラーが発生した場合、クライアントは別のエラーテーブルにエラー行を挿入します。挿入のプロセスは止めてはいけません。たとえば、tableAのcol1に同じpk値を持つ2つの行がある場合、最初の行はtablebに挿入し、pk違反の2番目の行は同じ構造を持つ別の表に挿入する必要があります。今私はSQLサーバーでこれを行う方法を理解していません。全体挿入はアトミックトランザクションです。これはトランザクションのプロパティです。

キャッチブロックでこれをどのように管理できるか

+0

私はあなたのストアドプロシージャで意味catchブロックで仮定? catchブロックは、アトミックトランザクション全体のエラーをキャッチします。だから...複数の行の挿入を行うcatchブロックでこれを管理することはできません。あなたはもっと細かいレベルでこの種のものを扱う必要があります。ループが心に浮かびますが、実際のルールに応じて、代わりに複数の挿入ステートメントを使用できる場合があります。 –

+0

はい上記の挿入文はspです。ルーピングは非常に遅いプロセスになります。毎月のプッシュが必要な記録は6000万件近くあります。 – sam

+0

そうですね、ループの代わりに2つの挿入ステートメントでこれを行うことができたと言われています。何が起こっているのかに関する情報があまりないので、ここではたくさんの提案をするのは難しいです。受け入れられる行を挿入します。 2番目に、PKに違反する行が挿入されます。 –

答えて

0

これはSSISで非常に簡単に処理できます。成功したレコードが目的のテーブルに移動し、失敗したレコードがエラーテーブルに格納される可能性があります。私のスクリーンショットはかなり基本的です。ステージングテーブルを十分なレコードで満たし、エラーが発生したレコードをエラーテーブルにロードするフラットファイルをロードしています。

enter image description here

+0

私はそれが簡単だろうとは思わなかった – sam

+0

@Jasonは、SSISソリューションなしで答えを加えればよいでしょう。これは代替/回避策です。 –

関連する問題