我是SSIS的新手,具有以下平面文件,需要加载到MS SQL Server的Orders表中,
ID,Order1,Package1,Order2,Package2
1,O1,P1,O2,P2
2,O3,P3,O4,P4
3,O5,P5,O6,P6
我需要像使用SSIS的bleow一样将上述平面文件值加载到Orders表中,
ID Order Package
1 O1 P1
2 O2 P2
3 O3 P3
4 O4 P4
5 O5 P5
6 O6 P6
并且我正在尝试将所有(O1到O6以及P1到P6)列映射到Order and Package,如下所示,但是我做不到。
任何解决方案。
答案 0 :(得分:3)
从SSIS
解决方案的角度来看,您可以像下面这样实现
阅读完平面文件后,您需要将输入行分为两行,Multicast
可以完成。然后将Union
的多播数据作为一个。现在,SSIS
中没有ROW_NUMBER()
的直接概念,因此必须使用Script Component
作为转换来实现。
脚本组件代码(在ScriptMain:UserComponent中使用此代码)-
int rowNumber = 1;
string order = "";
string package = "";
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if ((order != Row.Order) & (package != Row.Package))
{
Row.ID = rowNumber;
rowNumber = rowNumber + 1;
}
order = Row.Order;
package = Row.Package;
}
参考:link
答案 1 :(得分:0)
您需要unpivot
数据。
这可以在源查询中完成
SELECT [ID], [Order1] AS [Order], Package1 AS [Package] FROM <table_name>
UNION ALL
SELECT [ID], [Order2] AS [Order], Package2 AS [Package] FROM <table_name>
或者在SSIS中,Multi Cast
后跟Union All
转换也应该如此。
[Source]---->[Multi Cast]====>[Union All]---->[Destination]
Union All
的设置看起来像
Output | Input 1 | Input 2
-----------------------------
ID | ID | ID
Order | Order1 | Order2
Package | Package1 | Package2
在您的示例中,您创建了一个新ID,可以使用ROW_NUMBER
或在SSIS中使用Script Transform
使用ROW_NUMBER
SELECT
[ID] = ROW_NUMBER() OVER(ORDER BY [ID], [Priority]),
[Order],
[Package]
FROM (
SELECT [ID], 1 AS [Priority], [Order1] AS [Order], [Package1] AS [Package]
FROM <table_name>
UNION ALL
SELECT [ID], 2 AS [Priority], [Order2] AS [Order], [Package2] AS [Package]
FROM <table_name>
) t