SSIS foreach 循环将所有唯一客户分组到一个表中,并将其写入自己的文件



我有一个表,用于存储我的所有客户及其发票(总共不到 5k),我想使用 foreach 循环容器将每个(客户)写入他们自己的文件中列出他们自己的发票。

我之前使用过foreach循环容器来读取/加载/写入文件,所以我理解该部分,但是如何在帐号上应用foreach循环作为枚举器?

对于每个文件,我只需要客户信息。

我的桌子:

AccountNumber   InvoiceNumber   OriginalCharge
A255            2017-11         225.00
A255            2017-12         13.50
A255            2018-01         25.00
D870            2017-09         7.25
D870            2017-10         10.00
R400            2016-12         100.00
R400            2017-03         5.00
R400            2017-04         7.00
R400            2017-09         82.00

因此,这将生成 3 个文件,并将包括给定客户的发票/原始费用。

文件 1 = 客户 A255

文件 2 = 客户 D870

文件 3 = 客户 R400

还是我应该以不同的方式处理这个问题?

环境:SQL Server 2014 SSIS-2012

谢谢!

您需要应用几种不同的配方才能完成这项工作。

  • 动态文件名
  • 源查询参数化
  • 切碎记录集

假设

有三个 SSIS 变量:

  • 当前帐号字符串(初始值 A255)
  • rsAccountNumbers 对象
  • 文件名输出字符串 EvaluateAsExpression = True"C:\ssisdataoutput\" + @[User::CurrentAccountNumber] + ".txt"

该包看起来像

[Execute SQL Task] -> [Foreach (Ado.net) Enumerator] -> [Data Flow Task]

执行 SQL 任务

将结果集类型设置为"完整">

您的源查询将SELECT DISTINCT AccountNumber FROM dbo.Invoices;

在"结果"选项卡中,假设为 OLE DB 连接管理器,单击"添加结果"按钮并使用"名称"0,变量将变为User::rsAccountNumbers

福里奇 (Ado.net) 枚举器

将枚举器类型设置为 Ado.NET 和单个表。使用变量 User::rsAccountNumbers 并将 zeroeth 元素分配给我们的变量 CurrentAccountNumber

按原样运行包,以验证执行 SQL 任务是否返回 Foreach 可以切碎的结果集。观察枚举器中的每个循环都会导致变量的值FileNameOutput发生变化(C:\ssisdata\output\A255.txt、C:\ssisdata\output\D870.txt等)

数据流任务

这是一个简单的流程

[OLE DB Source] -> [Flat File Destination]

将 OLE DB 源配置为查询SELECT * FROM dbo.Invoices WHERE D.AccountNumber = ?;

单击参数按钮。将名称 0 配置为 @[用户::当前帐号]

平面文件目标 - 将源连接到目标,创建新的 平面文件连接管理器并连接列。

动态文件名

最后部分是编辑上面创建的平面文件连接管理器,以使用变量FileNameOutput而不是您指示的硬编码值。右键单击平面文件连接管理器,然后选择属性。在生成的属性窗口中,找到"表达式"属性并单击省略号 (...) 在左侧窗口中,找到 ConnectionString,在右侧窗口中,使用 @[User::FileNameOutput]

F5 和包应启动并生成每个帐号的输出文件。

相关内容

最新更新