3

我有一个像下面这样的场景。

源数据如下(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

ID并且CatType是我的目标表中的复合键。我从源代码获取 CatType。在加载数据时,我必须通过在 Destination 表中选择 Max(ID) where CatType= ?(based on CatType) 来增加 ID 如何在 SSIS 中加载这些记录,有人能指出我正确的方向吗?

4

2 回答 2

3

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

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

来源_001

来源_002

  • 在 SQL Server 数据库中,创建名为dbo.CategoryName. 这是将加载数据的最终表。它在列上具有复合键,Id并且CatType.

目标表

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

暂存表

  • 在 SQL Server 数据库中,使用本文底部提供的存储过程脚本dbo.PopulateDestination部分中提供的脚本创建一个存储过程。此存储过程结合使用函数和子句来识别应分配给 CatType 值的正确 Id。RANKPARTITION

  • 创建一个新的 SSIS 包。创建一个名为SQLServer. 这将指向您的 SQL Server 数据库。创建了一个名为Source.

连接管理器

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

平面文件一般

  • Flat File Connection Manager Editor的Advanced选项卡上,重命名列信息。- integer , - string (10) , - string (30)数字表示 OutputColumnWidth。LegacyIdCatTypeName

平面文件列

  • 在 SSIS 包的控制流选项卡上,放置一个Execute SQL task, 后跟Data Flow Task另一个Execute SQL task.

SSIS 控制流

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

截断临时表

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

数据流任务

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

平面文件连接管理器

平面文件列

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

OLE DB 连接管理器

OLE DB 列

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

执行 SQL 任务以运行存储过程

  • 执行包。请记住,该包配置为仅读取第一个源文件Source_001.csv。打包执行后,查询目标表CategoryName找到如下数据。

第一次执行后的目的地

  • 现在,停止 SSIS 包的执行,双击名为Source. 将文件名路径更改为Source_002.csv以读取第二个文件。

更改平面文件连接文件名

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

希望有帮助。

第二次执行后的目标表

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
于 2012-04-16T21:34:22.350 回答
1

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

如果是,您可以使用派生列来做这两件事

于 2012-04-16T20:47:25.003 回答