SSIS foreach 循环将所有唯一客户分组在 table 中并将它们写入自己的文件
SSIS foreach loop to group all unique customers in a table and write them to their own file
我有一个 table 存储我所有的客户和他们的发票(总共不到 5k),我想使用 foreach 循环容器将这些(客户)中的每一个写到他们自己的列出他们自己的发票的文件。
我之前对 read/load/write 文件使用过 foreach 循环容器,所以我理解那部分,但是如何在 AccountNumber 上应用 foreach 循环作为枚举数?
对于每个文件,我只需要该客户信息。
我的table:
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 个文件,并且会包含给定客户的 invoices/original 费用。
文件 1 = 客户 A255
文件 2 = 客户 D870
文件 3 = 客户 R400
或者我应该采用不同的方法吗?
环境:SQL服务器 2014
SSIS-2012
谢谢!
您需要应用一些不同的配方来完成这项工作。
- 动态文件名
- 源查询参数化
- 粉碎记录集
假设
您有三个 SSIS 变量:
- CurrentAccountNumber 字符串(A255 的初始值)
- rsAccountNumbers 对象
- FileNameOutput String EvaluateAsExpression = True
"C:\ssisdata\output\" + @[User::CurrentAccountNumber] + ".txt"
包裹看起来像
[Execute SQL Task] -> [Foreach (Ado.net) Enumerator] -> [Data Flow Task]
执行SQL任务
将结果集类型设置为完整
您的源查询将是 SELECT DISTINCT AccountNumber FROM dbo.Invoices;
在“结果”选项卡中,假设使用 OLE DB 连接管理器,单击“添加结果”按钮并使用 "name" 0,变量变为 User::rsAccountNumbers
Foreach (Ado.net) 枚举器
将您的枚举器类型设置为 Ado.NET 和单一 table。使用变量 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 配置为 @[User::CurrentAccountNumber]
平面文件目标 - 将源连接到目标,创建一个新的
平面文件连接管理器并连接列。
动态文件名
最后一步是编辑上面创建的平面文件连接管理器,以使用变量 FileNameOutput
而不是您指定的硬编码值。右键单击平面文件连接管理器和 select 属性。在生成的属性 window 中,找到表达式 属性 并单击省略号 (...) 在左侧 window 中,找到 ConnectionString 并在右侧 window 中使用 @ [用户::文件名输出]
F5 并且程序包应该启动并为每个帐号生成一个输出文件。
我有一个 table 存储我所有的客户和他们的发票(总共不到 5k),我想使用 foreach 循环容器将这些(客户)中的每一个写到他们自己的列出他们自己的发票的文件。
我之前对 read/load/write 文件使用过 foreach 循环容器,所以我理解那部分,但是如何在 AccountNumber 上应用 foreach 循环作为枚举数?
对于每个文件,我只需要该客户信息。
我的table:
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 个文件,并且会包含给定客户的 invoices/original 费用。
文件 1 = 客户 A255
文件 2 = 客户 D870
文件 3 = 客户 R400
或者我应该采用不同的方法吗?
环境:SQL服务器 2014 SSIS-2012
谢谢!
您需要应用一些不同的配方来完成这项工作。
- 动态文件名
- 源查询参数化
- 粉碎记录集
假设
您有三个 SSIS 变量:
- CurrentAccountNumber 字符串(A255 的初始值)
- rsAccountNumbers 对象
- FileNameOutput String EvaluateAsExpression = True
"C:\ssisdata\output\" + @[User::CurrentAccountNumber] + ".txt"
包裹看起来像
[Execute SQL Task] -> [Foreach (Ado.net) Enumerator] -> [Data Flow Task]
执行SQL任务
将结果集类型设置为完整
您的源查询将是 SELECT DISTINCT AccountNumber FROM dbo.Invoices;
在“结果”选项卡中,假设使用 OLE DB 连接管理器,单击“添加结果”按钮并使用 "name" 0,变量变为 User::rsAccountNumbers
Foreach (Ado.net) 枚举器
将您的枚举器类型设置为 Ado.NET 和单一 table。使用变量 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 配置为 @[User::CurrentAccountNumber]
平面文件目标 - 将源连接到目标,创建一个新的 平面文件连接管理器并连接列。
动态文件名
最后一步是编辑上面创建的平面文件连接管理器,以使用变量 FileNameOutput
而不是您指定的硬编码值。右键单击平面文件连接管理器和 select 属性。在生成的属性 window 中,找到表达式 属性 并单击省略号 (...) 在左侧 window 中,找到 ConnectionString 并在右侧 window 中使用 @ [用户::文件名输出]
F5 并且程序包应该启动并为每个帐号生成一个输出文件。