我的解决方案看起来像 N + 1 个平面文件连接管理器来处理源文件。CM A 将解决跳过前 4 行文件格式,B 听起来它只是一个 2 列文件,等等。最后一个 CM 将用于解析您说明的命令文件。
现在您已经定义了所有这些连接管理器,您可以开始处理逻辑了。
创建 3 个变量。2 类型的字符串(CurrentPath,CurrentType)。1 是 Object 类型,我称之为 Recordset。
第一个数据流使用“CM Control”从平面文件源中读取所有行。这是您在示例中提供的数据。
然后,我们将使用该 Recordset 对象作为 ForEach 循环容器的源,通常称为粉碎。Bingle 术语“Shred 记录集 ssis”,您一定会看到许多描述如何做到这一点的文章。最终结果是,对于该源 CM 控制文件中的每一行,您将这些值分配给 CurrentPath、CurrentType 变量。
在该循环容器内,创建一个控制中心点,以便控制向外辐射。我发现一个脚本任务非常适合这个。将它拖到画布上,给它一个强名称以表明它不用于任何事情,然后创建一个数据流来处理每个处理排列。
魔术来自使用表达式。在 SSIS 中的所有东西附近都可以在其属性上设置表达式,这就是专业人士与装腔作势者的区别。在这里,我们将双击连接到给定数据流的线并将约束类型从“约束”更改为“表达式和约束”然后您将使用的表达式类似于@[User::CurrentType] == "A"
这将确保仅当两个父任务成功且条件为真。
第二个表达式魔法将应用于连接管理器本身。他们需要让他们的 ConnectionString 属性由属性值驱动@[User::CurrentFile]
。这将允许控制文件中的设计时值C:\filea.txt
但允许运行时值是\\network\share\ClientFileA.txt
除非所有文件具有相同的结构,否则您很可能需要在属性中将 DelayValidation 设置为 True。否则,SSIS 将失败 PreValidation,因为所有“CM A”到“CM N”都将使用该 CurrentFile 变量,该变量可能是也可能不是该文件布局的有效连接字符串。