【问题标题】:Check for multiple files检查多个文件
【发布时间】:2011-12-08 10:29:58
【问题描述】:

好的,我会尽量解释清楚...相当特殊的情况。

工具:SSIS 2008

我们有一个控制流,现在需要由一个事件触发:一个或多个文件的存在。 (1,2 或 3)

使用的变量:

BO_FileLocation_1
BO_FileLocation_2
BO_FileLocation_3
BO_FileName_1
BO_FileName_2
BO_FileName_3

可以有一个、两个或三个文件:在上述变量中​​定义。填写完毕后, 他们应该被处理。当它们为空时,这意味着只有一个文件文件,进程应该忽略它们并跳转到下一个(文件观察器?)任务。 例如:

BO_FileLocation_1= "C:\"
BO_FileLocation_2 NULL
BO_FileLocation_3 NULL
BO_FileName_1= "test.csv"
BO_FileName_2 NULL
BO_FileName_3 NULL

报告只需要一个文件。

我需要一个通用概念来检查这些文件是否存在,它可能比我现在的 SSIS 知识可以处理的更通用。例如方便,当将来有第 4 个文件时。我还在考虑使用单个脚本来处理所有逻辑。

提前致谢

一张可能不相关的图片:

【问题讨论】:

  • 这是一个准确的总结:在运行数据流之前确保 N 个文件存在的通用方法是什么?

标签: sql triggers business-intelligence ssis


【解决方案1】:

如果您只想在存在一个或多个文件时触发Copy Source File to handle,只需在流程中使用 OR 约束即可。下图向您展示了如何:

首先将所有连接到目的地:

然后单击其中一个绿色箭头。这将使其属性窗口弹出。选择 Logical OR 而不是 Logical AND

如果一切顺利,您现在应该会看到连接为虚线:

【讨论】:

  • 我不认为这是一个可行的解决方案,如上所述。如果业务需要在导入所有可用文件后“做某事”,这将违反业务规则。只要至少导入一个文件,它就会简单地启动“做某事”命令。此外,如果任务完成并且没有文件,它将运行“做某事”。
  • 从我在问题中读到的内容,它只需要正确导入其中一个文件。不过我可能理解错了。
  • 谢谢伙计们,我很欣赏您的解决方案:我想我会执行优先约束任务。 (应该考虑一下!但是,嘿,探索 SSIS 的任务/可能性)
【解决方案2】:

有几种可能的解决方案:

  1. 创建一个序列容器并将所有文件导入包含在序列容器中。为 RowCountFile1、RowCountFile2 和 RowCountFile3 添加 int 变量并将值设置为 0(这是创建 int 变量时的默认值)。将 RowCount 转换添加到每个数据流。创建从序列容器到“做某事”任务的优先约束。将优先约束设置为成功和表达式。将表达式值设置为@RowCountFile1 > 0 || @RowCountFile2 > 0 || @RowCountFile3 > 0。这种方法的优点是您可以在检测到文件后立即执行操作,导入所有可用文件,并且仅在导入所有文件后执行操作。然后,您可以安排将此 SSIS 包作为 SQL Server 代理作业步骤运行,并根据需要尽可能频繁地运行它。

  2. 解决方案 1 的变体是用于序列容器内的每个文件枚举器容器。如果您不知道文件的确切名称并且您希望在某些情况下导入多个文件,这将很有用。例如,如果您每隔几分钟就得到一个文件名中带有时间戳的文件,并且您的进程由于某种原因没有运行,那么您可能必须处理多个文件才能赶上,然后在它完成后采取行动完成。

  3. 您可以使用问题中概述的文件观察程序任务。我对文件观察任务的唯一问题是包必须处于不断运行的状态。这使得解决问题和性能变得困难。它还可能引入其他问题,因为我记得几年前文件监视任务首次出现时遇到了一些问题。现在它可能是一个完全稳定的任务,但在之前被烧毁之后,我更喜欢其他方法而不是任务。如果你真的希望包连续运行而不是让它被作业调用,那么你总是可以使用脚本任务来检查文件,如果找不到则休眠线程,再次检查等等。我相信这就是文件观察任务确实如此,但我会相信我自己的 C# 来完成任务。任何使用 File Watcher 的人都比我有更好的体验...

  4. 使用 PowerShell。如果您只想在出现文件并且不导入数据时执行操作,那么 PowerShell 脚本可以像 SSIS 包一样执行此操作。缺点是你必须学习一些基本的 PowerShell,将来可能很难维护,因为 PowerShell 可能不是你的核心语言,如果你想的话,你可能不得不再次将代码重写为 SSIS 包导入数据。您可能会从 SQL Server 代理作业步骤调用 PowerShell 脚本,因此可以轻松处理调度。

还有比我列出的更多的选项,所以如果您还需要更多建议,请告诉我。

【讨论】:

  • 谢谢伙计们,我很欣赏您的解决方案:我想我会执行优先约束任务。 (应该考虑一下!但是,嘿,探索 SSIS 的任务/可能性)
猜你喜欢
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多