检查多个文件

时间:2011-12-08 10:29:58

标签: sql triggers business-intelligence ssis

好的,我会尝试尽可能好地解释......相当具体的情况。

工具: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个文件时很方便。我还想用一个脚本来处理所有的逻辑。

提前致谢

可能不相关的图片: enter image description here

2 个答案:

答案 0 :(得分:1)

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

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

然后单击其中一个绿色箭头。这将使其属性窗口弹出。选择Logical OR代替Logical ANDprecedence constraint properties

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

final look

答案 1 :(得分:1)

有几种可能的解决方案:

  1. 创建一个序列容器并在序列容器中包含所有文件导入。为RowCountFile1,RowCountFile2和RowCountFile3添加int变量,并将值设置为0(这是创建int变量时的默认值)。为每个数据流添加RowCount转换。从序列容器到“执行某事”任务创建优先约束。将优先约束设置为success和expression。将表达式值设置为@ 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脚本,因此可以非常轻松地处理调度。

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