質問
標準リレーションを持つツリーテーブル、Customer、Invoice、InvoiceRowがあります。
これらは、行タイプを識別する各行の最初の2文字で1つの固定フィールド長ファイルにエクスポートする必要があります。行タイプには異なる仕様があります。
スクリプトブロックでネストされたループを使用してそれを行うことができますが、これは私の最初のSSISパッケージであり、そのソリューションは間違っていると感じています。
編集:
出力には次のものが必要です:
Customer
Invoice
Rows
Customer
Invoice
Rows
and so on
解決
スクリプト宛先コンポーネントを使用してこれを行うことに対するあなたの直感は正しいです。残念ながら、このシナリオはSSISとうまく連動しません。私はこれを初心者向けパッケージとは考えていません。 SSISを使用する必要がある場合は、すべてのデータを内部結合することから始めます。したがって、3つのテーブルすべてから必要なデータを含むInvoiceRowごとに1つの行があります。
CustomerCols、InvoiceCols、RowCols
次に、スクリプト宛先コンポーネントでは、顧客と請求書の値を追跡する必要があります。これらの値は変更されるため、出力に追加の行を書き込む必要があります。
詳細については、スクリプトコンポーネントを使用した宛先の作成を参照してください。スクリプトの宛先。
私の経験では、スクリプトの宛先は良好なパフォーマンスを発揮できることが示されています。
他のヒント
スクリプト宛先を記述することは避け、スクリプト変換+フラットファイル宛先のみを使用します。このようにして、SSISが実際にファイルに書き込むことができるようにしながら、論理出力(データの文字列)に集中します(ファイルへの書き込みではなく、ビジネスに集中できます)。
最初に、非正規化データを取得する必要があります。 DBMSで結合と並べ替えを行うことはできますが、DBMSに過度の負荷をかけたくない場合は、並べ替えられたデータを取得し、2つのSSIS結合結合変換を使用して結合します。
次に、スクリプトを実行します。現在の顧客と請求書の値を実行し続け、変更時に出力し、入力ごとにInvoiceRowを出力します。このようなもの:
if (this.CustomerID != InputBuffer.CustomerID) {
this.CustomerID = InputBuffer.CustomerID;
OutputBuffer.AddRow();
OutputBuffer.OutputColumn = "Customer: " + InputBuffer.CustomerID + " " + InputBuffer.CustomerName;
}
// repeat the same code for Invoice
OutputBuffer.AddRow();
OutputBuffer.OutputColumn = "InvoiceRow: " + InputBuffer.InvoiceRowPrice;
最後に、単一の列(スクリプトによって作成されたOutputColumn)を持つフラットファイル宛先を追加して、これをファイルに書き込みます。
3つのテーブルを処理して、出力がすべて出力ファイル(行タイプ指定子を含む)に適切になるようにします。データフロー内の3つの別々のフローパスでこれを実行し、次に、Union Allデータフロー要素で行をまとめる必要があります。そこから、必要に応じて処理して出力ファイルを作成します。