【问题标题】:SSIS package - How to produce multiple files with a foreach loop container?SSIS 包 - 如何使用 foreach 循环容器生成多个文件?
【发布时间】:2023-03-22 05:21:01
【问题描述】:

如何在一个 SSIS 包中生成多个文件?我创建了一个生成单个文件的文件,但不知道如何生成多个文件。

我生成的包使用变量来了解要检索哪些数据,并使用平面文件连接管理器中的表达式为文件分配正确的名称(基于变量)。

我创建的单个包检索我想要销售数据的城市(纽约)和月份(2020 年 9 月)作为变量/参数,并使用它们来提取适当的数据。执行的 SQL 语句示例:

select * from table1 where City = ? and Period = ??

然后它使用这些来为要导出的文件建立名称并将其发送到文件夹。但是如何在同一个包中生成多个文件呢?如何让同一个 SSIS 包为芝加哥(2020 年 7 月)、丹佛(2020 年 6 月)和圣地亚哥(2020 年 3 月)生成另一个文件?

我打算有一张表来说明需要生产什么。

  • ExampleRow1:芝加哥,2020 年 9 月,Produce=Yes。
  • ExampleRow2:迈阿密,2020 年 1 月,Produce=Yes。

因此,SSIS 包将需要使用该信息来生成文件,然后一次又一次地执行此操作,直到不再生成任何内容。这甚至可能吗?我知道 foreach 循环容器可以提供帮助,但不确定它是否可以处理如此多的变量变化。这几乎是我创建的第一个包,这就是我如此无知的原因。提前致谢!

【问题讨论】:

    标签: ssis foreach-loop-container


    【解决方案1】:

    现在,您的两个 SSIS 变量(City 和 Period)的值可以正常工作,并且您已将其参数化,因此我不会将其视为您的第一个 SSIS 包。人们努力完成更简单的任务

    您需要做的是将协调器/驱动程序表连接到您的包中。下面是我们将如何做到这一点。

    1. 创建一个名为rsObject 的对象类型的SSIS 变量。这将保存一个记录集对象,也就是我们查询的结果。

    执行 SQL 任务

    将执行 SQL 任务添加到控制流。称它为“SQL 获取驱动程序数据”你会使用类似的查询

    SELECT T.City, T.Period FROM dbo.ExtractSetup AS T WHERE T.Produce = 1;
    

    将无结果集的默认设置更改为完整结果集。这告诉 SSIS 需要一个表格形状的返回对象,但需要一些东西来捕获传入的数据。

    在“结果”选项卡中,您现在需要将结果映射到 SSIS 变量中。假设是一个 OLE DB 类型的连接管理器,您将在变量列表中选择 User::rsObject,然后选择 0 作为记录集名称(从内存中执行此操作,因此细节可能略有偏差)

    保存并运行该任务。假设没有错误,当包运行时,我们的记录集对象中有一组可能为空的数据。让我们做点什么吧。

    粉碎数据

    我通常看到的用于从 SSIS 中的可枚举对象中获取数据的名称称为“粉碎数据”。它的实现是 Foreach 枚举器 - 您的工具包中最强大的工具之一。

    将 ForEach 循环容器拖到画布上。将连接线(先例约束)从“SQL Get Driver Data”拖到我们新的 ForEach 循环容器中。我将其命名为“FELC Shred Results”以表明我的意图。

    双击任务并将默认枚举类型从文件系统更改为“Ado.net 记录集” 这与您是否使用 OLE、ODBC 或 ADO.NET 连接管理器来填充类似表的对象无关。如果是表,请使用 ADO.NET Recordset。

    将我们的变量 [User::rsObject] 指定为 Recordset 对象的源。

    我们需要做的最后一件事是配置我们应该对枚举器中的当前行做什么。那在“映射”选项卡中。在这里,您将添加两个参数,这将是一个基于零的序数系统。为您的第一个条目选择 [User::City](或任何您命名的 City 变量)并将其映射到列名称 0。添加一行并使用 User::Period 并将其映射到列 1

    最后一步是采用现有逻辑(数据流任务和其他任何依赖于变量的逻辑)并将其移至 FELC。这实际上是用鼠标在其周围绘制一个框以突出显示所有内容并按住鼠标左键并将其拖动到 FELC 中。

    按 F5,您应该会生成 2 个文件。

    【讨论】:

    • 非常感谢您的帮助!
    • 但是,我以另一种方式更新了我的包,因为我太笨了,无法理解您的解决方案。我仍然不知道如何解决它,但我已经取得了一些进展。我现在要做的是检查是否有要生成的文件(根据表格说明需要生成哪些文件)。如果没有要生成的文件,则包结束。如果要生成文件,则使用变量选择正确的数据并生成文件。但随后包裹结束。但是,如果我再次运行该包,它将生成下一个文件。如果我再次运行它,它将产生另一个文件。
    • 所以我的包在某种意义上是有效的,如果我运行足够多的时间,它将生成我需要的所有文件。如果可能的话,我想做的是只运行一次包并以某种方式使其生成所有文件。
    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多