私のソリューションは、ソース ファイルを処理するための N + 1 個のフラット ファイル接続マネージャーのように見えます。CM A は最初の 4 行をスキップするファイル形式に対応し、B は 2 列のファイルのように聞こえます。最後の CM は、説明したコマンド ファイルを解析するために使用されます。
これらの接続マネージャーをすべて定義したので、処理ロジックに取り掛かることができます。
3 つの変数を作成します。文字列型の 2 (CurrentPath、CurrentType)。1 は Object 型で、これを Recordset と呼びます。
最初のデータ フローは、「CM コントロール」を使用してフラット ファイル ソースからすべての行を読み取ります。これは、例で提供したデータです。
次に、その Recordset オブジェクトを、一般にシュレッディングと呼ばれる ForEach ループ コンテナーのソースとして使用します。「Shred recordset ssis」という言葉を思い浮かべると、その方法を説明する記事がたくさん出てくるはずです。最終的な結果として、そのソース CM 制御ファイルの各行に対して、それらの値を CurrentPath および CurrentType 変数に割り当てます。
そのループ コンテナ内に、制御が放射状に広がるように、制御の中心点を作成します。これにはスクリプト タスクが最適です。それをキャンバスにドラッグし、何にも使用されないことを示す厳密な名前を付けてから、各処理順列を処理するデータ フローを作成します。
魔法は式を使用することから生まれます。SSIS のほぼすべての Dang は、そのプロパティに式を設定できます。これが、プロとポーザーを区別するものです。ここで、特定のデータ フローに接続している線をダブルクリックし、制約の種類を [制約] から [式と制約] に変更します。次に使用する式は次のようなものです@[User::CurrentType] == "A"
。親タスクが成功し、条件が真です。
式マジックの 2 番目のビットは、接続マネージャー自体に適用されます。プロパティの値によって駆動される ConnectionString プロパティが必要@[User::CurrentFile]
です。これにより、設計時の値C:\filea.txt
は許可されますが、制御ファイルからの実行時の値は次のようになります。\\network\share\ClientFileA.txt
すべてのファイルが同じ構造でない限り、プロパティで DelayValidation を True に設定する必要があります。そうしないと、SSIS は PreValidation に失敗します。これは、"CM A" から "CM N" までのすべてが、そのファイル レイアウトの有効な接続文字列である場合とそうでない場合がある CurrentFile 変数を使用するためです。