文件到达文件夹时触发SSIS包的执行

时间:2014-11-28 22:27:44

标签: ssis

我在SSIS中有场景。我有一个包,它是从flatfile到数据库的简单数据移动。 我有一个特定的位置,我想在文件夹上的文件时执行该包。

2 个答案:

答案 0 :(得分:8)

使用WMI事件观察程序任务

的分步操作
  1. 创建WMI连接管理器。在本地运行时使用Windows凭据(您必须是管理员才能访问WMI事件信息),并在远程运行时输入凭据(确保加密您的包!)
  2. 添加新的WMI事件监视器任务。使用WQL查询配置WQLQuerySource属性以查看文件的特定文件夹。
  3. WQL类似于SQL,但略有偏离,这是我用来观看文件夹的示例:

    SELECT * FROM __InstanceCreationEvent WITHIN 10 
    WHERE TargetInstance ISA "CIM_DirectoryContainsFile" 
    and TargetInstance.GroupComponent= "Win32_Directory.Name=\"c:\\\\WMIFileWatcher\"" 
    

    分解此查询超出了范围,但请注意过滤器中的目录名称以及使其运行所需的字符串转义。

    enter image description here

    1. 创建For Each循环并将其附加到WMI事件观察程序任务。使用Foreach文件枚举器进行设置,并将文件夹设置为您正在观看的文件夹。
    2. enter image description here

      1. 在For Each Loop编辑器的Variable Mappings选项卡中,将文件名指定给变量。
      2. enter image description here

        1. 使用该变量名对文件执行操作(例如,将其分配给平面文件连接的ConnectionString属性并在数据流任务中使用该连接),然后将文件存档到其他位置。
        2. 在下图中,此包将一直运行,直到添加文件,处理它,然后完成。

          Event watcher wired up to foreach file enumerator

          要使程序包永久运行,请将这两个任务包装在For循环中,并将EvalExpression设置为true == true。

          enter image description here

          您还可以考虑registering object events using PowerShell并在触发这些事件时启动SSIS包。这需要不断减少持续运行包的开销,但它会增加额外的依赖性。

答案 1 :(得分:2)

WMI解决方案很有意思,但环境/设置要求对我的口味来说有点复杂。我更喜欢在For循环容器内使用ForEach循环容器和执行SQL等待任务来解决这个问题。

我将ForEach循环容器配置为循环遍历目录中的文件,并将其指向期望的文件名。此Container中唯一的任务是一个脚本任务,它会增加一个Files_Found变量 - 这只会在找到文件时发生。

ForEach循环容器之后是一个执行SQL任务,在检查之间等待,例如WAITFOR DELAY '00:05:00'延迟5分钟。

ForEach循环和执行SQL任务都包含在For循环中,它初始化并测试Files_Found变量。

这个解决方案管理起来要简单得多 - 它不需要任何特定的设置,环境,权限,存储的凭据或WMI语法知识。