3


0

私は少しSSISの初心者で、システム全体は簡単に思えますが、このシナリオで実行する必要があるプロセスを概念的には理解していません。

  1. 送信元データベースのInvoiceテーブルとInvoiceLineテーブルを、送信先データベースの2つの同等のテーブル(異なるID値)にマップする必要があります。

  2. 挿入された各請求書について、割り当てられたIDを取得してから、その新しいIDを参照するすべての行を挿入する必要があります。

  3. 請求書には代用キー(請求書番号)がありますが、これらもターゲットシステムの請求書番号と衝突する可能性があるため、番号を変更する必要があります。

これは統合における一般的なシナリオである必要があります - 一般的な解決策はありますか?

2 Answer


1


クリスKL - これは予想以上に難しいというのは正しいですね。 これには3つの方法があり、それぞれ異なる状況で機能します。

  1. ロードするデータが小さい場合(数百または数千、数十万ではない)、次の操作を実行できます。各親行に対して1回ずつ挿入を実行し、ID値を返すOLEDBコマンドを使用します。それからその下流でそれからの子行への出力を結合し、それらを挿入します。 利点:直感的です。 デメリット:拡張性が悪い。 この方法はウェブ上で文書化されており、あなたのためにグーグルにすべきです。

  2. 一括読み込みが必要な、より大きなシステムについて話しているのであれば、他に2つの種類があります。

{空} ロード中にテーブルに排他的にアクセスできる場合(本当に排他的で、何らかの方法で強制されている場合)は、テーブルから既存の最大IDを取得し、SSISスクリプトタスクを使用してその最大IDより上の行に番号を付けてからSet Identity挿入をオンにして入力し、ID挿入をオフに設定します。 次に、SSISにこれらのスクリプト生成キーを配置して、子行に割り当てます。 利点:早くて簡単な、DBへの1回の旅行。 デメリット:他のプロセスがテーブルに同時に挿入するとエラーが発生する可能性があります。 脆い。

{空} b あなたが排他的アクセス権を持っていないのであれば、私が知る唯一の方法はDBへのラウンドトリップを使うことです。例えば)。 2番目のデータフローでは、ビジネスキーを使用して親IDを取得するLookupトランスフォームを使用して子レコードを処理します。 ルックアップが適切に調整されていることを確認してください。 キャッシングし、ビジネスキーにインデックスを付けます。


0


OK、これは良いニュース/悪いニュースの状況です。 最初に良い知らせとあなたが知っているかもしれないちょっとした背景を説明しますが、私はあなたが知らない場合に備えてそれを置きます。

一般的に、IDENTITY列に_anything_を挿入することはできません。 もちろん、他のすべての人生と同じように、あなたが必要とする時間があり、それはIDENTITY_INSERTオプションで実行できます。

SET IDENTITY_INSERT MyTable ON

MyTableへの挿入(MyIdCol、Etc…)SELECT SourceIdCol、Etc…からMySourceTable

MyTableをSET IDENTITY_INSERT

さて、あなたはあなたがターゲット内に代理キーを持っていると言います、しかしあなたはそれらが衝突するかもしれないと言います。 だから私は少し混乱しています…あなたはソースからのキーを使っていますか。 IDENTITYカラム)またはターゲットに新しいキーを生成していますか? キースペースを単一のキー列にマージしようとしないことを強くお勧めします。 キーを保持する必要がある場合は、SourceSystemIdのようなものを使用してそれらを一意にするマルチフィールドキーをお勧めします。

最後に悪い知らせ:SSISはIDENTITY_INSERTオプションを使う簡単な方法を提供していません。 私ができる唯一の方法は、挿入タスクの前に実行されるSQLタスクでそれをオンにすることです。 テーブル名を変数としてスクリプトに渡すことができるはずです。 一度に1つのテーブルでしか使用できないため、後でオフにするには別のSQLタスクを含めるようにしてください。