如何在一个输出中对多个输入进行分组

时间:2011-06-15 20:02:40

标签: visual-studio-2008 sql-server-2008 etl ssis

我有像这样的Excel

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

我想填写像这样的数据库表

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

但我不知道如何对这些列和标题进行分组以填充数据库表。有任何想法吗?我很遗憾这个应用程序

1 个答案:

答案 0 :(得分:1)

您可以使用Unpivot Transformation中提供的Data Flow Task在SSIS中实现此目的。以下示例说明了如何完成此操作。该示例使用SSIS 2008 R2SQL 2008 R2数据库。

分步流程:

  1. 使用示例数据创建一个Excel文件,如屏幕截图# 1 所示。我已将该文件命名为 Source.xlsx

  2. 使用 SQL Scripts 部分下提供的脚本在名为dbo.Destination的SQL Server数据库中创建一个表。此表将填充Excel数据。我引入了一个名为 GroupId 的新字段,以便将数据组合在一起。

  3. 在SSIS包上,创建名为Excel的Excel连接和名为SQLServer的OLE DB连接,如屏幕截图# 2 所示。 Excel connection manager的配置应如屏幕截图# 3 所示。 OLE DB连接将配置为连接到您选择的数据库。

  4. 在包的Control Flow标签上,放置Data Flow Task,如屏幕截图# 4 所示。

  5. 配置数据流标签,如屏幕截图# 5 所示,其中包含Excel sourceScript componentUnpivot transformationOLE 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 中的数据。

  13. 希望有所帮助。

    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