2010-11-25 15 views
14

SSISは特にフラストレーションの高いフラットファイルの処理に関して2つのことを行いますが、周りには方法があるようですが、わかりません。 10列のフラットファイルを定義する場合、行マーカーの末尾にCRLFで区切られたタブは、すべての行に正確に10の列があるファイルに対しては完全に機能します。 2つの痛みを伴うシナリオは、これらのされています。誰かがどこか11列目でファイルを提供する場合は、それを定義していないため、SSISは、単に、それを無視して可変列番号を持つSSISフラットファイル

  1. 、それはいいだろう。それはあなたが定義した10の列を読んでから、行マーカーの終わりにスキップしなければなりませんが、代わりに10番目の列のデータと追加のデータを連結し、すべて10番目の列に入れます。本当に役に立たないもの。私はこれが起こることを認識します。なぜなら、10列目の区切り記号は他のすべてと同じようにタブではなくCRLFなので、余分なタブを何も置き換えずにCRLFまですべてを取り込むだけです。私の意見では、これは賢明ではありません。

  2. 誰かが9列だけのファイルを提供すると、さらに悪いことが起こります。予期せず見つかったCRLFを一時的に無視し、欠落している列に次の行の先頭からの列を埋め込みます。スマートではありませんがここでは控えめです。誰がそれを起こしたかったでしょうか?残りのファイルはその時点でのガベージです。

(もちろん、行の最後にだけバリエーションがreaonably)より少ないまたは追加の列X(扱うことができ、何らかの理由でファイルの幅の変動を持って無理いないようですが、これがあるように見えます

これまでの私たちの唯一の解決策は、行を1つの巨大な列(column0)としてロードし、スクリプトタスクを使用して多くの区切り文字を使用して動的に分割することですこれは、行の幅を4000文字(1つのUnicode列の最大幅)に制限する点を除いて、うまくいきます。幅の広い行をインポートする必要がある場合(テキストのインポートに複数の4000幅の列を指定する場合)、複数列をaboとしてあなたは、行ごとに厳密な数の列を必要とすることに悩まされています。

これらの制限を回避する手段はありますか?

答えて

12

Glenn、私はあなたの苦しみを感じています:) SSISでは、各列のメタデータを格納する必要があり、あらゆる種類のデータを格納できるフラットファイルを使用しているため、列を動的にすることはできません「それは最後の列ではない列」内のCRLFが実際に読み取るはずのデータ行の終わりであると想定することはできません。

SQL2000のDTSと異なり、実行時にSSISパッケージのプロパティを変更することはできません。

親パッケージを作成し、フラットファイル(スクリプトタスク)を読み込み、フラットファイルの最初の行だけを読み込んで列数と列名を取得します。この情報は変数に格納できます。

次に、親パッケージはプログラムで子パッケージ(スクリプトタスク)を読み込み、子パッケージのソース接続のメタデータを更新します。 1.フラットファイルと一致するように列を追加/削除します。 2.列の列区切り文字を設定し、最後の列はCRLF - ROW区切り文字と一致する必要があります。 3.データフロータスクのソースコンポネントのメタデータ(ComponentMetadata.ReinitializeMetadata())を再初期化しますソース接続の変更)。 4.子ssisパッケージを保存します。

プログラムでパッケージを変更する方法の詳細は、すぐに利用できます。

次に、親パッケージは子パッケージ(Execute Package Task)を実行するだけで、新しいマッピングで実行されます。