仅处理新文件

时间:2012-11-05 13:45:54

标签: sql-server ssis

我有一个来源,要从中处理文件。随机出现多个文件(包装应每2小时运行一次)。我只需处理新文件,我无法删除,从该位置移动已处理的文件。我只能将文件复制到存档位置。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:0)

您的包应该处理给定目录中的文件,然后在处理后将它们移动到另一个目录。这样,每次包运行时,都必须完全处理源目录。

要处理目录中的每个文件,请使用ForEach容器。您可以指定要查找的文件夹,以及要过滤的一些表达式。例如,如果您的文件名包含时间戳,则可以使用该时间戳来过滤或删除文件。

使用平面文件源读取文件,然后使用文件系统任务移动它们。

答案 1 :(得分:0)

首先,请看一下答案:Enumerate files in a folder using SSIS Script Task

SSIS脚本任务应枚举给定文件夹中的所有文件,然后从表中获取已处理文件的快照,您将在其中记录已处理的文件,忽略已处理的文件并返回非文件在一个对象变量中处理,以供每个要使用的任务使用。

答案 2 :(得分:0)

您可以使用以下步骤实现此目的。

  1. 将foreach文件枚举器用于传入的文件夹并保存 “IncomingFile”变量中的文件名。配置选择“名称 和扩展“[在我的代码我已经使用过,否则你需要做 对剧本的一些修改]
  2. 创建两个SSIS变量,例如“ArchivePath”作为字符串和 “IsLoaded”为布尔值[默认为false]。
  3. 创建SSIS脚本组件并使用“IncomingFile”和 “ArchivePath”作为只读变量。 “IsLoaded”应该是 ReadandWrite变量。
  4. 在脚本组件中编写以下代码。如果文件已经存在 存在然后它将返回true。否则为假。

    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

  6. 希望这有帮助。