【问题标题】:Triggering execution of SSIS package when Files Arrive in a Folder当文件到达文件夹时触发 SSIS 包的执行
【发布时间】:2014-11-28 22:27:44
【问题描述】:

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

【问题讨论】:

  • 请不要只求我们为您解决问题。向我们展示如何尝试自己解决问题,然后向我们确切地展示结果是什么,并告诉我们您为什么觉得它不起作用。请参阅“What Have You Tried?”了解您真正需要阅读的优秀文章。
  • 其实我对此一无所知。目前我必须在 ssis 中创建一个上传器,该上传器之前以鹰的速度运行。在 eagle 中,当文件到达时有一个特定位置,然后 eagle 会自动感知并执行该文件。所以我可以手动执行包。但我想知道当文件进入该位置时有什么方法可以触发该包。或者我不明白我必须从哪里开始。
  • SSIS 没有监视文件到达然后启动包的功能。您必须自己编写此类功能。查看 SSIS 文件系统任务,看看它是否可以为您完成部分工作(也许它可以告诉您文件是否存在),然后查看其他 SSIS 任务。看看是否可以将它们放在一起解决问题。
  • @JohnSaunders 呃,SSIS 有一个 WMI 事件观察器任务,它正是这样做的:观察事件(包括放入文件夹中的文件),然后对这些事件采取行动。

标签: ssis


【解决方案1】:

逐步使用 WMI 事件观察任务

  1. 创建 WMI 连接管理器。在本地运行时使用 Windows 凭据(您必须是管理员才能访问 WMI 事件信息),并在远程运行时输入凭据(请务必加密您的包!)
  2. 添加新的 WMI 事件观察程序任务。使用 WQL 查询配置 WQLQuerySource 属性以查看特定文件夹中的文件。

WQL 类似于 SQL,但略有不同,这是我用来监视文件夹的示例:

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

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

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

  1. 在 For Each 循环编辑器的变量映射选项卡中,将文件名分配给变量。

  1. 使用该变量名对文件执行操作(例如,将其分配给平面文件连接的 ConnectionString 属性并在数据流任务中使用该连接),然后将文件归档到其他位置。

在下图中,此包将一直运行,直到添加一个文件,对其进行处理,然后完成。

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

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

【讨论】:

  • 很好的答案,但你能稍微填写一下这个例子吗?也许显示任务将如何连接?那么这将是一个很好的答案。我在 SSIS 工作了八年多,从来不知道这个功能。
  • 谢谢。顺便说一句,图像来自哪个 SQL Server 版本?
  • 它们都来自 SSDT / Visual Studio 2012 Premium Edition。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 请尝试与 Kyle Hale 的回答竞争。
  • 我太忙了——你需要发挥你的想象力。
  • 在 SSIS 2012 中,您将使用表达式任务而不是脚本任务来减少开销。此外,WAITFOR 是特定于 SQL Server 的,可能需要提及。
猜你喜欢
  • 2014-02-21
  • 2013-02-22
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
相关资源
最近更新 更多