SSIS数据转换

时间:2010-05-13 08:23:12

标签: ssis

我正在尝试将数据从一个数据库传输到一个新数据库。我从一个表中获取数据说我取了人的名字,然后我把它插入表人。这将生成一个我想插入到地址表中的personID。应该使用SSIS的方法是什么。有什么建议吗?

4 个答案:

答案 0 :(得分:4)

你有几种方法可以去这里。

  1. 如果这是表的一次性初始加载,我建议在插入语句之前使用SET IDENTITY_INSERT ON。这将允许您自己插入标识,从而无需检索密钥。您必须使用脚本任务等来创建密钥序列。
  2. 使用SQL命令任务执行插入语句,然后执行SELECT SCOPE_IDENTITY()以将插入标识提取到从SQL命令任务返回的参数。这是有风险的,因为你无法保证@@ identity来自你的插页。如果有其他用户进行多次插入,这只是一个真正的风险。
  3. 因此,如果您决定选择#2​​,那么您可以采用以下方式。

    创建两个表来表示您的旧系统和新系统:

    CREATE TABLE [dbo].[Person](
        [ID] [int] IDENTITY(100,1) NOT NULL,
        [FirstName] [varchar](50) NULL,
        [LastName] [varchar](50) NULL
    ) ON [PRIMARY];
    
    CREATE TABLE [dbo].[Person_OldSystem](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [FirstName] [varchar](50) NULL,
        [LastName] [varchar](50) NULL
    ) ON [PRIMARY];
    

    使用两个条目填写人员表:

    alt text http://www.freeimagehosting.net/uploads/ff56e32bea.gif

    创建一个存储过程来执行插入并返回新的id:

    ALTER PROCEDURE [dbo].[sp_InsertPerson] 
        @Fname varchar(50),
        @Lname  varchar(50),
        @id integer OUTPUT
    AS
    BEGIN
    
        INSERT INTO QandA..Person (FirstName, LastName) VALUES (@Fname, @Lname);
        SELECT @id = SCOPE_IDENTITY();
    
    END
    

    接下来,我们将设置SSIS包。在此示例包中,添加单个数据流任务。在数据流任务中添加以下任务并将其连接起来,如图所示。

    alt text http://www.freeimagehosting.net/uploads/5348332a9e.gif

    请注意,数据查看器会随着我们的进展向您显示结果。

    设置OLE DB源任务以从Person_OldSystem表中提取所有列。

    设置派生列任务以添加名为“NewID”的列

    alt text http://www.freeimagehosting.net/uploads/a5c6c9e7c6.gif

    使用以下SQL设置OLE DB命令任务。

    EXEC sp_InsertPerson ?, ?, ? OUTPUT
    

    在OLE DB命令任务的高级属性中,设置以下列映射:

    alt text http://www.freeimagehosting.net/uploads/2224622431.gif

    因此,我们对数据流的所作所为是从旧系统中提取人员列表。然后,我们添加一个名为NewID的新列,以便在将行插入新表时保存该行的标识。

    alt text http://www.freeimagehosting.net/uploads/8162127377.gif

    OLE DB命令调用我们的存储过程,该过程执行插入并在最后一个参数中重新计算新行的id。然后将返回的id映射到我们为它准备的数据流中的列。

    alt text http://www.freeimagehosting.net/uploads/97dbfba277.gif

    条件分割用于将数据流提供给某个地方。

答案 1 :(得分:0)

我建议有两个独立的数据流 - 第一个从你的人手表中加载?源表和第二个加载您的地址表与人员ID。

答案 2 :(得分:0)

创建另一个控制流任务,在数据流部分,从源表中获取personid,您将其称为Person表,并插入目标表,即Address表

答案 3 :(得分:0)

这完全取决于您的具体情况。以下是几种可能性:

  1. 在加载地址表时,您是否拥有可用人员的业务密钥(例如,人员姓名 - 唯一标识人员记录的任何内容)?如果是,请使用它在Person表上执行查找。

  2. 或者您是否正在寻找为新创建的人员创建新地址记录的方法?在这种情况下,理想的情况是您在Person表中有一个Created datetime字段,该字段将在插入Persons时被填充。然后,您可以使用该时间戳来检索所有人员ID,例如,所有人员记录都已创建>地址表的最大创建时间戳。

  3. 同样,这完全取决于以上内容可能需要根据您的具体情况进行调整。我希望它能让你开始。