微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SSIS包-如何使用foreach循环容器生成多个文件?

如何解决SSIS包-如何使用foreach循环容器生成多个文件?

如何在一个SSIS包中生成几个文件?我创建了一个只产生一个文件文件,但是不知道如何产生多个文件

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

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

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

然后使用它们为要导出的文件建立名称,并将其发送到文件夹。但是,如何在同一个包中生成多个文件呢?我怎样才能使同一个SSIS包为芝加哥2020年7月生成一个文件,为丹佛2020年6月生成一个文件,为圣地亚哥2020年3月生成一个文件

我计划有一个表来指示需要生产什么。

  • ExampleRow1:芝加哥,2020年9月,生产=是。
  • ExampleRow2:迈阿密,2020年1月,生产=是。

因此,SSIS程序包将需要使用该信息来生成文件,然后一次又一次地进行操作,直到没有更多内容可以生成为止。这有可能吗?我知道一个foreach循环容器可以提供帮助,但是不确定它是否可以处理这么多的变量更改。这几乎是我创建的第一个程序包,这就是为什么我对此一无所知。预先感谢!

解决方法

现在,对于两个SSIS变量(城市和时期)的值,它都可以正常工作,并且已对其进行了参数化,因此,我不会把它当作第一个SSIS包。人们为轻松得多的任务而苦苦挣扎

您需要做的是将业务流程/驱动程序表连接到您的程序包中。这就是我们要做的事情。

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

执行SQL任务

将执行SQL任务添加到控制流中。将其称为“ SQL Get Driver Data”(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切碎结果”以表明我的意图。

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

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

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

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

点击F5,您应该已生成2个文件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。