如何解决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包。人们为轻松得多的任务而苦苦挣扎
您需要做的是将业务流程/驱动程序表连接到您的程序包中。这就是我们要做的事情。
- 创建一个名为
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 举报,一经查实,本站将立刻删除。