Sql server 仅处理新文件

Sql server 仅处理新文件,sql-server,ssis,Sql Server,Ssis,我有一个处理文件的来源。多个文件在任意时间随机到达该位置(包应每2小时运行一次)。我只能处理新文件,不能删除、移动已处理的文件。我只能将文件复制到存档位置。如何实现这一点?您的软件包应该处理给定目录中的文件,然后在处理后将其移动到另一个目录。这样,每次包运行时,它都必须完全处理源目录 要处理目录中的每个文件,请使用ForEach容器。您可以指定要查找的文件夹和一些要筛选的表达式。例如,如果您的文件名包含时间戳,您可以使用该时间戳来过滤您的文件 您可以使用平面文件源读取文件,然后使用文件系统任务移

我有一个处理文件的来源。多个文件在任意时间随机到达该位置(包应每2小时运行一次)。我只能处理新文件,不能删除、移动已处理的文件。我只能将文件复制到存档位置。如何实现这一点?

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

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


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

首先,请查看以下答案:


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

您可以使用以下步骤实现这一点

  • 对传入文件夹使用foreach文件枚举器并保存 “IncomingFile”变量中的文件名。配置为选择“名称” 扩展“[在我的代码中,我已经使用了它,否则您需要这样做 对脚本的一些修改]
  • 创建两个SSIS变量,如“ArchivePath”作为字符串和 “IsLoaded”为布尔值[默认为false]
  • 创建SSIS脚本组件并使用“IncomingFile”和 “ArchivePath”作为只读变量。“IsLoaded”应该是 读写变量
  • 在脚本组件中编写以下代码。如果文件已被删除 如果存在,则返回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;
    }
    
  • 使用优先级约束调用数据流任务,计算操作应为“表达式”。在表达式框中设置如下内容

    @IsLoaded==False


  • 希望这有帮助。

    问题是我无法移动已处理的文件。我只能使用存储已处理文件名的表来检查文件是否已处理。谢谢!!!我使用了这个标志,并在表中添加了一个标志,在这个标志中,只有当文件被处理时,标志才会被更新。