1

標準のリレーションを持つツリーテーブル、Customer、Invoice、およびInvoiceRowがあります。

これらは、各行の最初の2文字が行タイプを識別する1つの固定フィールド長ファイルにエクスポートする必要があります。行タイプの仕様は異なります。

スクリプトブロック内のネストされたループでそれを行うことはおそらく可能ですが、これは私の初めてのSSISパッケージであり、そのソリューションは間違っていると感じています。

編集:

出力には次のものが必要です。

Customer  
Invoice  
Rows  
Customer  
Invoice  
Rows  
and so on
4

3 に答える 3

1

ScriptDestinationコンポーネントを使用してこれを行うことに対するあなたの直感は正しいです。残念ながら、このシナリオはSSISとうまく調和しません。私はこれを初心者向けパッケージとは考えていません。SSISを使用する必要がある場合は、すべてのデータを内部結合することから始めます。これにより、InvoiceRowごとに1つの行があり、3つのテーブルすべてから必要なデータが含まれます。

CustomerCols、InvoiceCols、RowCols

次に、スクリプトの宛先コンポーネントで、顧客と請求書の値を追跡する必要があります。これらが変更されると、出力に追加の行を書き込む必要があります。

スクリプトの宛先の詳細については、スクリプトコンポーネントを使用した宛先の作成を参照してください。

私の経験では、スクリプトの宛先は優れたパフォーマンスを発揮する可能性があります。

于 2008-10-18T04:38:11.397 に答える
1

Script Destination を記述することは避け、Script Transform + Flat File Destination のみを使用します。このようにして、論理出力 (データの文字列) に集中しながら、SSIS がファイルへの実際の書き込みを実行できるようにします (少し効率的であることに加えて、ファイルへの書き込みではなく、ビジネスに集中できます)。

まず、非正規化されたデータを取得する必要があります。結合と並べ替えは DBMS で実行できますが、DBMS に過度の負担をかけたくない場合は、並べ替えられたデータを取得し、2 つの SSIS Merge Join 変換を使用して結合します。

次に、スクリプトを実行します。現在の Customer と Invoice の値を実行し続け、変化したときにそれらを出力し、入力ごとに 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) を持つフラット ファイルの宛先を追加して、これをファイルに書き込みます。

于 2008-10-21T05:54:48.900 に答える
0

3 つのテーブルを処理して、すべての出力が出力ファイルに適したものになるようにします (行タイプ指定子を含む)。データ フロー内の 3 つの個別のフロー パスでこれを行う必要があります。次に、行を Union All データ フロー要素にまとめます。そこから、必要に応じてそれらを処理して、出力ファイルを作成します。

于 2008-10-17T19:00:52.077 に答える