0

ファイルを処理するソースがあります。複数のファイルがいつでもランダムにその場所に来ています (パッケージは 2 時間ごとに実行する必要があります)。新しいファイルのみを処理する必要があります。削除することはできません。既に処理されたファイルをその場所から移動します。ファイルをアーカイブの場所にコピーすることしかできません。どうすればこれを達成できますか?

4

3 に答える 3

0

まず、こちらの回答をご覧ください: SSIS スクリプト タスクを使用してフォルダー内のファイルを列挙する

SSIS スクリプト タスクは、特定のフォルダー内のすべてのファイルを列挙し、処理済みファイルのログを保持するテーブルから既に処理済みのファイルのスナップショットを取得し、既に処理済みのファイルを無視して、未処理のファイルを単に返す必要があります。 for-each タスクが消費するオブジェクト変数。

于 2012-11-05T14:58:22.447 に答える
0

これは、次の手順を使用して実現できます。

  1. 着信フォルダーに foreach ファイル列挙子を使用し、ファイル名を「IncomingFile」変数に保存します。「名前と拡張子」を選択するように構成します[私のコードでは、それ以外の場合はスクリプトを変更する必要があります]
  2. 「ArchivePath」を文字列として、「IsLoaded」をブール値として [デフォルトは false] のように、2 つの SSIS 変数を作成します。
  3. SSIS スクリプト コンポーネントを作成し、"IncomingFile" と "ArchivePath" を読み取り専用変数として使用します。「IsLoaded」は ReadandWrite 変数である必要があります。
  4. スクリプト コンポーネントに次のコードを記述します。ファイルが既に存在する場合は 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;
    }
    
  5. Precedence 制約を使用してデータ フロー タスクを呼び出し、評価操作は "Expression" にする必要があります。式ボックスに次のように設定します。

    @IsLoaded==False

お役に立てれば。

于 2012-11-05T17:38:47.287 に答える
0

パッケージは、指定されたディレクトリ内のファイルを処理し、処理後に別のディレクトリに移動する必要があります。そうすれば、パッケージが実行されるたびに、ソース ディレクトリを完全に処理する必要があります。

ディレクトリ内の各ファイルを処理するには、ForEach コンテナーを使用します。検索するフォルダーと、フィルター処理するいくつかの式を指定できます。たとえば、ファイル名にタイムスタンプが含まれている場合、そのタイムスタンプを使用してファイルをフィルター処理したり除外したりできます。

フラット ファイル ソースを使用してファイルを読み取り、ファイルシステム タスクを使用してファイルを移動します。

于 2012-11-05T14:08:12.953 に答える