Как я могу сгруппировать несколько входов в один выход - PullRequest
0 голосов
/ 16 июня 2011

У меня есть такой Excel

region    state    city
-------------------------
south     state1    city1
north     state2    city2

и я хочу заполнить таблицу базы данных следующим образом

  id      name       type
 ------------------------
   1      state1     state
   2      south      region
   3      city1      city

Но я понятия не имею, как сгруппировать эти столбцы и заголовки, чтобы заполнить таблицу базы данных. Есть идеи? Я довольно потерян с этим приложением

1 Ответ

1 голос
/ 16 июня 2011

Этого можно добиться в SSIS, используя Unpivot Transformation, доступное в Data Flow Task. Следующий пример иллюстрирует, как это можно сделать. В примере используются базы данных SSIS 2008 R2 и SQL 2008 R2.

Пошаговый процесс:

  1. Создайте файл Excel с образцами данных, как показано на скриншоте # 1 . Я назвал файл как Source.xlsx .

  2. Создайте таблицу в базе данных SQL Server с именем dbo.Destination, используя скрипт, указанный в разделе Сценарии SQL . Эта таблица будет заполнена данными Excel. Я ввел новое поле с именем GroupId , чтобы данные можно было группировать вместе.

  3. В пакете служб SSIS создайте соединение Excel с именем Excel и соединение OLE DB с именем SQLServer, как показано на снимке экрана # 2 . Excel connection manager должен быть настроен, как показано на скриншоте # 3 . Соединение OLE DB будет настроено для подключения к базе данных по вашему выбору.

  4. На вкладке Control Flow пакета поместите Data Flow Task, как показано на скриншоте # 4 .

  5. Настройте вкладку «Поток данных», как показано на скриншоте # 5 с Excel source, Script component, Unpivot transformation и OLE DB destination.

  6. Настройте Excel Source, как показано на скриншотах # 6 и # 7 . Это будет читать данные из файла Excel.

  7. Настройте Script Component как Преобразование и добавьте столбец Output, как показано на скриншоте # 8 . В разделе Script нажмите Edit Script и замените код на код, указанный в разделе Код компонента сценария .

  8. Настройте преобразование Unpivot, как показано на скриншоте # 9 . Мы не хотим преобразовывать GroupId , поэтому не настраивайте его, а сделайте его Pass Through.

  9. Настройте OLE DB destination, как показано на скриншотах # 10 и # 11 .

  10. Снимок экрана # 12 показывает данные в таблице dbo.Destination до выполнения пакета.

  11. Снимок экрана # 13 показывает выполнение пакета.

  12. Снимок экрана # 14 показывает данные в таблице dbo.Destination после выполнения пакета.

Надеюсь, это поможет.

Сценарии SQL:

CREATE TABLE [dbo].[Destination](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](255) NULL,
    [Type] [nvarchar](255) NULL,
    [GroupId] [int] NULL,
 CONSTRAINT [PK_Destination] PRIMARY KEY CLUSTERED ([Id] ASC)
) ON [PRIMARY]
GO

Код компонента скрипта:

C # код, который можно использовать только в SSIS 2008 or above.

/* Microsoft SQL Server Integration Services Script Component
*  Write scripts using Microsoft Visual C# 2008.
*  ScriptMain is the entry point class of the script.*/

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    int groupId = 1;
    public override void PreExecute()
    {
        base.PreExecute();
    }

    public override void PostExecute()
    {
        base.PostExecute();
    }

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        Row.GroupId = groupId;
        groupId += 1;
    }
}

Скриншот №1:

1

Скриншот №2:

2

Скриншот № 3:

3

Снимок экрана № 4:

4

Скриншот № 5:

5

Снимок экрана № 6:

6

Снимок экрана № 7:

7

Скриншот № 8:

8

Снимок экрана № 9:

9

Снимок экрана № 10:

10

Скриншот № 11:

11

Снимок экрана № 12:

12

Снимок экрана № 13:

13

Снимок экрана № 14:

14

...