我会首先听取@bilinkc 给出的建议,并尝试通过 unpivot 解决这个问题。
点击这里 http://technet.microsoft.com/en-us/library/ms141723%28v=sql.100%29.aspx有关如何使用 SSIS Unpivot 数据流转换的详细信息。
但是,如果由于某种原因这不起作用,并且您确实想使用 SSIS 解决这个问题,我(有点)高兴地说,使用 SSIS 和一个数据流解决该问题在技术上是可行的。
以下是步骤的简短列表:
1) 将数据流任务添加到您的包中
2) 将平面文件源添加到数据流任务中
3) 使用连接管理器为平面文件配置平面文件源
4) 将多播数据流转换添加到您的数据流任务
5) 将平面文件源与多播数据流转换连接起来
现在是“有趣”的部分(复制和粘贴可以节省您的时间)...
6) 将 30 个条件拆分数据流转换添加到您的数据流任务
7) 将多播数据流转换连接到每个条件拆分数据流
8) 配置每个条件拆分N以拉取State N和City N有值的行子集
示例:条件拆分 1
输出名称:CTY1_ST1
条件:[CTY1] != "" && [ST1] != ""
9) 将 30 个派生列数据流转换添加到您的数据流
10) 将每一个连接到您的 30 个条件拆分
11) 为每个配置派生列名称 SEQ 和值 1 到 30
12) 添加 Union All 数据流转换并将 30 个数据管道重新合并在一起
现在“简单”的部分......
13) 将您的第一个排序转换添加到您的数据流任务中
14) 将第 31 个多播管道连接到您的第一个排序转换
15) 在旁边打勾并按ID排序(希望ID:NAME和ID:AGE是1:1)
16) 检查删除具有重复排序值的行
17) 添加第二个组播数据流转换
18) 将第二个排序转换添加到您的数据流任务中
19) 将您的 Union All 连接到第二个排序转换并按 ID 排序
20) 将合并连接添加到数据流任务中
21) 将第二个组播数据流转换连接为左输入
22) 将第二个排序转换连接到合并连接作为正确输入
23) 将合并连接配置为连接类型 = 内部连接并选择列 ID、SEQ、CTY、ST
24) 将您的第一个 OLE DB 目标添加到数据流中并将合并联接连接到它(结果为表 2)
25) 将第二个 OLE DB 目标添加到数据流并将第二个多播数据流转换连接到它(结果为表 1)