7

ネットワーク上にファイルを含むフォルダーがあり、あるフォルダーから別のフォルダーにファイルを移動しています。ただし、新しいファイルのみを移動したいので、移動先フォルダーに存在しないファイルのみをコピーします。どのように?for eachループ コンテナーとファイル システム タスクは既にあります。変数を使用しています。現在、パッケージが実行されるたびに、あるフォルダーから次のフォルダーにすべてのファイルがコピーされます。そこに固執できる条件付きツールはありますか?私はスクリプトを書くのが得意ではないので、それが唯一の解決策である場合は、あなたの助けが必要かもしれません.

4

2 に答える 2

11

Foreachループコンテナスクリプトタスク、およびファイルシステムタスクを使用してこれを実現できる1つの可能なオプションを次に示します。次の例は、これを行う方法を示しています。この例は、SSIS2008R2を使用して作成されました。

ステップバイステップのプロセス:

  1. スクリーンショット#1に示すように、パスにSourceDestinationという名前の2つのフォルダーを作成します。C:\temp\

  2. Sample_File_01.txtという名前のサンプルファイルをフォルダーパスC:\temp\Source\に配置し、他のフォルダーはC:\temp\Destination\空のままにします。SSISパッケージは、ファイルがまだ存在しない場合にのみ、ソースフォルダーから宛先フォルダーにファイルをコピーします。スクリーンショット#2および#3を参照してください。

  3. SSISパッケージで、スクリーンショット#4に示すように7つの変数を作成します。変数DestinationFolderを値に設定しますC:\temp\Destination\。変数SourceFolderを値に設定しますC:\temp\Source\。変数FilePatternを値に設定します*.*。要件に応じて、これらの変数の値を変更できます。

  4. 変数SourceFilePathを選択し、 F4ボタンPropertiesを押してウィンドウを開きます。プロパティEvaluateAsExpressionをに変更し、プロパティExpressionを値に設定します。スクリーンショット#5を参照してください。True@[User::SourceFolder] + @[User::FileName]

  5. 変数DestinationFilePathを選択し、 F4ボタンPropertiesを押してウィンドウを開きます。プロパティEvaluateAsExpressionをに変更し、プロパティExpressionを値に設定します。スクリーンショット#6を参照してください。True@[User::DestinationFolder] + @[User::FileName]

  6. スクリーンショット# 7および#8に示すように、SSISパッケージの[制御フロー]タブで、Foreach Loop containerを配置し、コンテナーのプロパティを構成します。[コレクション]セクションのラジオボタンを選択していることを確認してください。Name and extension

  7. Foreach Loopコンテナー内に、を配置しScript Taskます。スクリプトタスクをダブルクリックして、Edit Scriptボタンをクリックします。スクリプトタスク内のMain()メソッドを、 [スクリプトタスクコード]セクションで指定されたコードに置き換えます。このコードは、宛先ファイルがすでに存在するかどうかをチェックし、それに応じてブール変数DoesFileExistにデータを入力します。

  8. Foreach Loopコンテナー内でFile System Task、スクリプトタスクの下にを配置します。スクリプトタスクの成功の緑色の矢印をファイルシステムタスクに接続します。スクリーンショット#9に示すように、ファイルシステムタスクを構成します。

  9. ファイルが宛先パスに存在しない場合にのみ、ファイルシステムタスクを実行する必要があります。したがって、スクリプトタスクとファイルシステムタスクの間のコネクタを変更する必要があります。スクリーンショット# 10に示すように、緑色のコネクタを右クリックして[編集]を選択します。

  10. スクリーンショット# 11に示すように、優先順位制約を構成します。これにより、変数DoesFileExistに値が含まれているかどうかがチェックFalseされます。これは、ファイルが宛先で見つからなかったことを意味します。

  11. 構成すると、SSISパッケージはスクリーンショット# 12に示すようになります。

  12. スクリーンショット#13は、最初のパッケージ実行を示しています。この実行中、宛先パスにファイルはありませんでしたC:\temp\Destination\。実行後、ファイルSample_File_01.txtがにコピーされC:\temp\Source\ましたC:\temp\Destination\。スクリーンショット#14を参照してください。

  13. スクリーンショット#15は、2番目のパッケージの実行を示しています。この実行中、ファイルは宛先パスにコピーされませんでしたC:\temp\Destination\。お気づきFile System Taskのように、優先順位の制約が失敗したため、は実行されませんでした。

お役に立てば幸いです。

スクリプトタスクコード:

でのみ使用できるC#SSIS 2008 and aboveコード。

public void Main()
{
    Variables varCollection = null;

    Dts.VariableDispenser.LockForRead("User::DestinationFilePath");
    Dts.VariableDispenser.LockForWrite("User::DoesFileExist");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    varCollection["User::DoesFileExist"].Value = Convert.ToBoolean(System.IO.File.Exists(varCollection["User::DestinationFilePath"].Value.ToString()));

    Dts.TaskResult = (int)ScriptResults.Success;
}

スクリーンショット#1:

1

スクリーンショット#2:

2

スクリーンショット#3:

3

スクリーンショット#4:

4

スクリーンショット#5:

5

スクリーンショット#6:

6

スクリーンショット#7:

7

スクリーンショット#8:

8

スクリーンショット#9:

9

スクリーンショット#10:

10

スクリーンショット#11:

11

スクリーンショット#12:

12

スクリーンショット#13:

13

スクリーンショット#14:

14

スクリーンショット#15:

15

于 2011-07-12T15:42:18.347 に答える
1

これが2つの仮定を持つ潜在的な解決策です:

  1. 宛先フォルダー内のすべてのファイルは、このパッケージによって移動されました。
  2. ファイル名は一意です。

ETLにファイル名のログ記録ステップを追加できます。

ファイル名の列を使用して、データベースに新しいログテーブルを作成します。パッケージの各ループで、ファイル名をこのテーブルに書き込みます。次に、これをETLの条件付きロジックで使用される単純なルックアップテーブルとして使用して、処理中のファイル名が既存のファイルと一致するかどうかを確認できます。

ロギングステップと条件付きチェック(データフローで条件付き、スクリプトタスクで実行など)をどのように実装するかは、パッケージの設計によって異なりますが、探しているものを達成する必要があります。

于 2011-07-06T18:30:21.213 に答える