Как сопоставить несколько столбцов в один столбец в службах SSIS - PullRequest
0 голосов
/ 01 июля 2018

Я новичок в службах SSIS, у меня есть файл, показанный ниже, и мне нужно загрузить его в таблицу «Заказы» в MS SQL Server,

ID,Order1,Package1,Order2,Package2
1,O1,P1,O2,P2
2,O3,P3,O4,P4
3,O5,P5,O6,P6

Мне нужно загрузить значения выше плоского файла в таблицу «Заказы», ​​как и в случае использования SSIS,

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 и Package, как показано ниже, но я не смог.

enter image description here

любое решение для этого.

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

С точки зрения решения 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;
}

Ссылка: ссылка

0 голосов
/ 01 июля 2018

Вам нужно 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

В вашем примере вы создаете новый идентификатор, это можно сделать с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...