2011-12-08 19 views
0

さて、私はできるだけ詳しく説明しようと思います...かなり特殊なケースです。複数のファイルを確認してください

ツール:1または複数のファイルの存在:SSIS 2008

は現在は、イベントによってをトリガーにする必要がある制御フローを持っています。 (1,2又は3)使用

変数:

BO_FileLocation_1 
BO_FileLocation_2 
BO_FileLocation_3 
BO_FileName_1 
BO_FileName_2 
BO_FileName_3 

は1つ、2つまたは3つのファイルが存在することができる:上記の変数で定義されています。それらが記入されたら、 を処理する必要があります。それらが空の場合、これはただ1つのファイルファイルがあることを意味し、プロセスはそれらを無視して次の(ファイルウォッチャー?)タスクにジャンプする必要があります。 例:

BO_FileLocation_1= "C:\" 
BO_FileLocation_2 NULL 
BO_FileLocation_3 NULL 
BO_FileName_1= "test.csv" 
BO_FileName_2 NULL 
BO_FileName_3 NULL 

レポートには1つのファイルしか必要ありません。

これらのファイルの存在をチェックする一般的な概念が必要ですが、SSISの知識が現在処理できるより汎用的なものになる可能性があります。たとえば、将来4番目のファイルがある場合に便利です。私は、すべてのロジックを処理するための単一のスクリプトで作業することも考えていました。事前

おかげで、おそらく無関係な画像: enter image description here

+0

これは正確な要約ですか、データフローを実行する前にN個のファイルが存在することを保証する一般的なアプローチは何ですか? – billinkc

答えて

1

のファイルのいずれかが、ちょうどあなたの流れの中または制約を使用し、存在する場合、あなたが望むすべてがCopy Source File to handleをトリガーする場合。以下の画像はどのようにあなたを示しています

まず先に、すべてを接続します Original layout

そして、緑の矢印のいずれかをクリックしてください。これにより、プロパティウィンドウがポップアップ表示されます。代わりにLogical ANDLogical ORを選択: precedence constraint properties

すべてがうまくいった場合、あなたは今、破線で接続が表示されます。

final look

+0

これは上記のように実行可能な解決策ではないと思います。使用可能なすべてのファイルをインポートした後でビジネス上のニーズが「何かを行う」場合、これはビジネスルールに違反します。少なくとも1つのファイルがインポートされるとすぐに、「Do something」コマンドが開始されます。さらに、タスクが完了してファイルがない場合は、「Do something」を実行します。 –

+0

私が質問で読んだところから、ファイルの1つだけを正しくインポートする必要があります。私はそれを誤解しているかもしれません。 – cfrag

+0

ありがとうございます私はあなたのソリューションに感謝します:私は、先制抑制タスクに行くと思います。 (それについて考えていたはずですが、ちょっと、SSISのタスク/可能性を探る) – laurens

1

いくつかの可能なソリューションがあります。

  1. シーケンスコンテナを作成し、すべてのファイルインポートをシーケンスコンテナに含めます。 RowCountFile1、RowCountFile2、およびRowCountFile3にint変数を追加し、値を0に設定します(これはint変数を作成するときのデフォルト値です)。各データフローにRowCountトランスフォーメーションを追加します。シーケンスコンテナから「何かする」タスクへの優先制約を作成します。優先順位制約を成功と式に設定します。式の値を@ RowCountFile1> 0に設定します。 @ RowCountFile2> 0 || @ RowCountFile3> 0.このアプローチの利点は、ファイルが検出されるとすぐにアクションを実行し、使用可能なすべてのファイルをインポートし、すべてのファイルをインポートした後でアクションを取ることです。このSSISパッケージをSQL Serverエージェントのジョブステップとして実行するスケジュールを設定し、必要なだけ頻繁に実行することができます。

  2. 解決策1の亜種は、シーケンスコンテナ内の各ファイル列挙子コンテナに使用することです。これは、ファイルの正確な名前がわからず、場合によっては複数をインポートすると予想される場合に便利です。たとえば、ファイル名にタイムスタンプを付けて数分おきにファイルを取得し、何らかの理由でプロセスが実行されない場合は、複数のファイルを処理して捕捉し、完了しました。

  3. 質問に記載されているようにファイルウォッチャータスクを使用できます。私がファイルウォッチャータスクで持つ唯一の問題は、パッケージが常に実行中の状態でなければならないということです。これにより、問題とパフォーマンスのトラブルシューティングが難しくなります。何年も前に出てきたファイルウォッチャーのタスクにいくつかの問題があったことを覚えているので、他の問題も導入することができます。今はまったく安定した仕事かもしれませんが、私は以前に焼き付けられた後に仕事上の他の方法を好む。パッケージがジョブによって呼び出される代わりに継続的に実行されるようにするには、スクリプトタスクを使用してファイルをチェックし、見つからなければスレッドをスリープさせ、再度チェックするなどの方法があります。ファイルウォッチャータスクはありますが、私は自分のC#をタスクに対して信頼します。ファイルウォッチャーで私より優れた経験を持っている人には、パワー...

  4. PowerShellを使用してください。ファイルが表示され、データをインポートしていない場合にアクションを実行したいだけなら、PowerShellスクリプトはSSISパッケージと同様にこれを実行できます。欠点は、いくつかの基本的なPowerShellを学ばなければならないことです。PowerShellはおそらくあなたのパンとバターのコア言語ではないので、将来的には維持するのが難しいかもしれません。また、コードをSSISパッケージに書き直す必要があるかもしれません。データをインポートします。 PowerShellスクリプトをSQL Serverエージェントのジョブステップから呼び出すと、スケジューリングをかなり簡単に処理できます。

私がリストしたものよりも多くの選択肢がありますので、さらに提案が必要な場合は教えてください。

+0

ありがとう皆さん、私はあなたのソリューションに感謝します。私は先制攻撃の課題につきます。 (それについて考えていたはずですが、ちょっと、SSISのタスク/可能性を探る) – laurens