【问题标题】:Need to increment column value based on Other column In SSIS需要根据 SSIS 中的其他列增加列值
【发布时间】:2012-04-16 18:31:00
【问题描述】:

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

源数据如下(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。在加载数据时,我必须通过在 Destination 表中选择 Max(ID) where CatType= ?(based on CatType) 来增加 ID 如何在 SSIS 中加载这些记录,谁能指出我正确的方向?

【问题讨论】:

  • 是的,我认为我们可以通过在控制流中使用 SQL 任务来实现。但不确定。
  • @Siva 我刚刚用源数据更新了我的问题。

标签: sql-server ssis


【解决方案1】:

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 回到控制流选项卡,配置最后一个执行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

【讨论】:

  • 非常感谢 Siva 一步一步的解释。非常感谢它的工作良好。 :)
【解决方案2】:

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

如果是,您可以使用derived column 来做这两件事

【讨论】:

    猜你喜欢
    • 2015-10-10
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多