需要在SSIS中基于其他列增加列值

时间:2012-04-16 18:31:00

标签: sql-server ssis

我的情况如下。

源数据如下(XML文件)::

ID        CatType           Name
11           A              Raj
22           A              Rai
33           B              Raki
44           B              Krish
55           A              Rem
66           B              Ram

我必须将上方加载到下面的甲酸盐中。

ID       CatType        Name       LegacyID
1              A        Raj           11
2              A        Rai           22
1              B        Raki          33
2              B        Krish         44
3              A        Rem           55
3              B        Ram           66

IDCatType是目标表中的复合键。我从源头获取CatType。在加载数据时,我必须通过选择目标表中的CatType =?(基于CatType)的Max(ID)来增加ID 如何在SSIS中加载这些记录,是否有人能指出我正确的方向?

2 个答案:

答案 0 :(得分:3)

以下是使用SSIS 2008 R2创建的示例SSIS包,它演示了您要实现的目标。示例包将传入的文件数据加载到临时表中。然后使用SQL Server Rank函数和Partition子句,您可以根据您的要求加载数据。此示例假定您的数据库版本为SQL Server 2005 or above。由于您没有提供精确的XML文件格式,因此我使用CSV文件格式作为输入文件。

  • 让我们创建两个名为Source_001.csvSource_002.csv的示例CSV文件。创建了两个文件只是为了显示包逻辑的工作原理。

Source_001

Source_002

  • 在SQL Server数据库中,创建名为dbo.CategoryName的目标表。这是将数据加载到的最终表。它在列IdCatType上有复合键。

Destination table

  • 在SQL Server数据库中,创建名为dbo.CategoryName_Staging的临时表。这是文件数据临时加载的位置。此临时表结构模仿传入的文件结构。

Staging table

  • 在SQL Server数据库中,使用底部提供的存储过程脚本部分中提供的脚本创建名为 dbo.PopulateDestination 的存储过程这篇文章。此存储过程将 RANK 函数与 PARTITION 子句结合使用,以识别应分配给CatType值的正确ID。

  • 创建一个新的SSIS包。创建名为SQLServer的OLE DB连接管理器。这将指向您的SQL Server数据库。创建了名为Source

  • 的平面文件连接管理器

Connection managers

  • 配置平面文件连接管理器,如下所示。我已将源csv文件放在路径C:\temp\

Flat File General

  • 平面文件连接管理器编辑器高级选项卡上,重命名列信息。 LegacyId - 整数CatType - 字符串(10)Name - 字符串(30)数字表示OutputColumnWidth。

flat file columns

  • 在SSIS包的控制流标签上,放置Execute SQL task,然后放置Data Flow Task,然后放置另一个Execute SQL task

SSIS control flow

  • 双击第一个执行SQL任务并将其配置为截断登台表。

Truncate staging table

  • 双击数据流任务以切换到数据流选项卡。在数据流选项卡内,放置一个平面文件源管理器以读取CSV文件并放置一个OLE DB目标以将数据写入临时表。

Data flow task

  • 如下所示配置平面文件源,以使用平面文件连接管理器读取平面文件源。

Flat file connection manager

Flat file columns

  • 如下所示配置OLE DB destinaton以接受传入数据并写入目标文件。

OLE DB connection manager

OLE DB columns

  • 返回“控制流”选项卡,配置上一个“执行SQL”任务以调用新创建的存储过程。包开发现已完成。

Execute SQL task to run stored procedure

  • 执行包。请记住,程序包配置为只读取第一个源文件 Source_001.csv 。执行包后,查询目标表 CategoryName 以查找以下数据。

Destination after first execution

  • 现在,停止执行SSIS包,双击名为 Source 的平面文件连接管理器。将文件名路径更改为 Source_002.csv ,以便阅读第二个文件。

Change flat file connection file name

  • 再次执行包。该软件包现已配置为读取第二个源文件 Source_002.csv 。此执行将行添加到已填充的desitnation表中。执行包后,查询目标表 CategoryName 以查找以下添加数据,并注意Id列是否正确普及。

希望有所帮助。

Destination table after second execution

<强> Stored Procedure Script

CREATE PROCEDURE [dbo].[PopulateDestination]
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO dbo.CategoryName (Id, CatType, Name, LegacyId)
    SELECT      MAXID.Id + RANK() OVER(PARTITION BY CatType ORDER BY LegacyId) Id
            ,   CS.CatType
            ,   CS.Name
            ,   CS.LegacyId
    FROM        dbo.CategoryName_Staging    CS
    CROSS APPLY (
                    SELECT  COALESCE(MAX(Id), 0) Id
                    FROM    dbo.CategoryName C
                    WHERE   C.CatType = CS.CatType
                ) MAXID
END

答案 1 :(得分:1)

那么你真正需要的是根据cat类型创建一个新的ID列并将列名从ID更改为旧ID?

如果是,您可以使用derived column

执行这两项操作