我在SSIS中有场景。我有一个包,它是从flatfile到数据库的简单数据移动。 我有一个特定的位置,我想在文件夹上的文件时执行该包。
答案 0 :(得分:8)
WQL类似于SQL,但略有偏离,这是我用来观看文件夹的示例:
SELECT * FROM __InstanceCreationEvent WITHIN 10
WHERE TargetInstance ISA "CIM_DirectoryContainsFile"
and TargetInstance.GroupComponent= "Win32_Directory.Name=\"c:\\\\WMIFileWatcher\""
分解此查询超出了范围,但请注意过滤器中的目录名称以及使其运行所需的字符串转义。
在下图中,此包将一直运行,直到添加文件,处理它,然后完成。
要使程序包永久运行,请将这两个任务包装在For循环中,并将EvalExpression设置为true == true。
您还可以考虑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语法知识。