ネットワーク上にファイルを含むフォルダーがあり、あるフォルダーから別のフォルダーにファイルを移動しています。ただし、新しいファイルのみを移動したいので、移動先フォルダーに存在しないファイルのみをコピーします。どのように?for each
ループ コンテナーとファイル システム タスクは既にあります。変数を使用しています。現在、パッケージが実行されるたびに、あるフォルダーから次のフォルダーにすべてのファイルがコピーされます。そこに固執できる条件付きツールはありますか?私はスクリプトを書くのが得意ではないので、それが唯一の解決策である場合は、あなたの助けが必要かもしれません.
2 に答える
Foreachループコンテナ、スクリプトタスク、およびファイルシステムタスクを使用してこれを実現できる1つの可能なオプションを次に示します。次の例は、これを行う方法を示しています。この例は、SSIS2008R2を使用して作成されました。
ステップバイステップのプロセス:
スクリーンショット#1に示すように、パスにSourceとDestinationという名前の2つのフォルダーを作成します。
C:\temp\
Sample_File_01.txtという名前のサンプルファイルをフォルダーパス
C:\temp\Source\
に配置し、他のフォルダーはC:\temp\Destination\
空のままにします。SSISパッケージは、ファイルがまだ存在しない場合にのみ、ソースフォルダーから宛先フォルダーにファイルをコピーします。スクリーンショット#2および#3を参照してください。SSISパッケージで、スクリーンショット#4に示すように7つの変数を作成します。変数DestinationFolderを値に設定します
C:\temp\Destination\
。変数SourceFolderを値に設定しますC:\temp\Source\
。変数FilePatternを値に設定します*.*
。要件に応じて、これらの変数の値を変更できます。変数SourceFilePathを選択し、 F4ボタン
Properties
を押してウィンドウを開きます。プロパティEvaluateAsExpressionをに変更し、プロパティExpressionを値に設定します。スクリーンショット#5を参照してください。True
@[User::SourceFolder] + @[User::FileName]
変数DestinationFilePathを選択し、 F4ボタン
Properties
を押してウィンドウを開きます。プロパティEvaluateAsExpressionをに変更し、プロパティExpressionを値に設定します。スクリーンショット#6を参照してください。True
@[User::DestinationFolder] + @[User::FileName]
スクリーンショット# 7および#8に示すように、SSISパッケージの[制御フロー]タブで、
Foreach Loop container
を配置し、コンテナーのプロパティを構成します。[コレクション]セクションのラジオボタンを選択していることを確認してください。Name and extension
Foreach Loopコンテナー内に、を配置し
Script Task
ます。スクリプトタスクをダブルクリックして、Edit Script
ボタンをクリックします。スクリプトタスク内のMain()メソッドを、 [スクリプトタスクコード]セクションで指定されたコードに置き換えます。このコードは、宛先ファイルがすでに存在するかどうかをチェックし、それに応じてブール変数DoesFileExistにデータを入力します。Foreach Loopコンテナー内で
File System Task
、スクリプトタスクの下にを配置します。スクリプトタスクの成功の緑色の矢印をファイルシステムタスクに接続します。スクリーンショット#9に示すように、ファイルシステムタスクを構成します。ファイルが宛先パスに存在しない場合にのみ、ファイルシステムタスクを実行する必要があります。したがって、スクリプトタスクとファイルシステムタスクの間のコネクタを変更する必要があります。スクリーンショット# 10に示すように、緑色のコネクタを右クリックして[編集]を選択します。
スクリーンショット# 11に示すように、優先順位制約を構成します。これにより、変数DoesFileExistに値が含まれているかどうかがチェック
False
されます。これは、ファイルが宛先で見つからなかったことを意味します。構成すると、SSISパッケージはスクリーンショット# 12に示すようになります。
スクリーンショット#13は、最初のパッケージ実行を示しています。この実行中、宛先パスにファイルはありませんでした
C:\temp\Destination\
。実行後、ファイルSample_File_01.txtがにコピーされC:\temp\Source\
ましたC:\temp\Destination\
。スクリーンショット#14を参照してください。スクリーンショット#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:
スクリーンショット#2:
スクリーンショット#3:
スクリーンショット#4:
スクリーンショット#5:
スクリーンショット#6:
スクリーンショット#7:
スクリーンショット#8:
スクリーンショット#9:
スクリーンショット#10:
スクリーンショット#11:
スクリーンショット#12:
スクリーンショット#13:
スクリーンショット#14:
スクリーンショット#15:
これが2つの仮定を持つ潜在的な解決策です:
- 宛先フォルダー内のすべてのファイルは、このパッケージによって移動されました。
- ファイル名は一意です。
ETLにファイル名のログ記録ステップを追加できます。
ファイル名の列を使用して、データベースに新しいログテーブルを作成します。パッケージの各ループで、ファイル名をこのテーブルに書き込みます。次に、これをETLの条件付きロジックで使用される単純なルックアップテーブルとして使用して、処理中のファイル名が既存のファイルと一致するかどうかを確認できます。
ロギングステップと条件付きチェック(データフローで条件付き、スクリプトタスクで実行など)をどのように実装するかは、パッケージの設計によって異なりますが、探しているものを達成する必要があります。