ファイルを処理するソースがあります。複数のファイルがいつでもランダムにその場所に来ています (パッケージは 2 時間ごとに実行する必要があります)。新しいファイルのみを処理する必要があります。削除することはできません。既に処理されたファイルをその場所から移動します。ファイルをアーカイブの場所にコピーすることしかできません。どうすればこれを達成できますか?
3 に答える
まず、こちらの回答をご覧ください: SSIS スクリプト タスクを使用してフォルダー内のファイルを列挙する
SSIS スクリプト タスクは、特定のフォルダー内のすべてのファイルを列挙し、処理済みファイルのログを保持するテーブルから既に処理済みのファイルのスナップショットを取得し、既に処理済みのファイルを無視して、未処理のファイルを単に返す必要があります。 for-each タスクが消費するオブジェクト変数。
これは、次の手順を使用して実現できます。
- 着信フォルダーに foreach ファイル列挙子を使用し、ファイル名を「IncomingFile」変数に保存します。「名前と拡張子」を選択するように構成します[私のコードでは、それ以外の場合はスクリプトを変更する必要があります]
- 「ArchivePath」を文字列として、「IsLoaded」をブール値として [デフォルトは false] のように、2 つの SSIS 変数を作成します。
- SSIS スクリプト コンポーネントを作成し、"IncomingFile" と "ArchivePath" を読み取り専用変数として使用します。「IsLoaded」は ReadandWrite 変数である必要があります。
スクリプト コンポーネントに次のコードを記述します。ファイルが既に存在する場合は true を返します。それ以外の場合は False。
public void Main() { var archivePath = Dts.Variables["ArchivePath"].Value.ToString(); var incomingFile = Dts.Variables["IncomingFile"].Value.ToString(); var fileFullPath = string.Format(@"{0}\{1}",archivePath,incomingFile); bool isLoaded = File.Exists(fileFullPath); Dts.Variables["IsLoaded"].Value = isLoaded; Dts.TaskResult = (int)ScriptResults.Success; }
Precedence 制約を使用してデータ フロー タスクを呼び出し、評価操作は "Expression" にする必要があります。式ボックスに次のように設定します。
@IsLoaded==False
お役に立てれば。
パッケージは、指定されたディレクトリ内のファイルを処理し、処理後に別のディレクトリに移動する必要があります。そうすれば、パッケージが実行されるたびに、ソース ディレクトリを完全に処理する必要があります。
ディレクトリ内の各ファイルを処理するには、ForEach コンテナーを使用します。検索するフォルダーと、フィルター処理するいくつかの式を指定できます。たとえば、ファイル名にタイムスタンプが含まれている場合、そのタイムスタンプを使用してファイルをフィルター処理したり除外したりできます。
フラット ファイル ソースを使用してファイルを読み取り、ファイルシステム タスクを使用してファイルを移動します。