如何在SSIS中将多列映射到单列

时间:2018-07-01 10:20:32

标签: sql sql-server ssis etl ssis-2012

我是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,如下所示,但是我做不到。

enter image description here

任何解决方案。

2 个答案:

答案 0 :(得分:3)

SSIS解决方案的角度来看,您可以像下面这样实现

阅读完平面文件后,您需要将输入行分为两行,Multicast可以完成。然后将Union的多播数据作为一个。现在,SSIS中没有ROW_NUMBER()的直接概念,因此必须使用Script Component作为转换来实现。

enter image description here

全部联盟- enter image description here

脚本组件代码(在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