2010-05-13 71 views
2

我是SSIS的新手,所以请和我一起袒护。SSIS数据转换

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

回答

0

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

+0

你如何建议从第一张插入的表中获取人员ID? – 2016-09-26 06:52:43

5

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

  1. 如果这是表的一次初始加载,我建议在插入语句之前使用SET IDENTITY_INSERT ON。这将允许您自己插入标识,从而无需检索密钥。您必须使用脚本任务等来创建密钥序列。
  2. 使用SQL命令任务执行插入语句,然后执行SELECT SCOPE_IDENTITY()将插入的标识拉到从SQL命令任务返回的参数。这是有风险的,因为您不能保证@@身份来自您的插入。如果从其他用户进行多次插入,这只是一个真正的风险。

所以,如果你决定去#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]; 

填写Person表有两个条目:

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

创建一个存储过程来完成的插入和回报新编号:

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

设置的OLE DB命令任务具有以下SQL列。

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命令调用我们的存储过程,而不会插入和reutrn新行的ID中的最后一个参数。这个返回的id然后映射到我们为之准备的数据流中的列。

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

条件性拆分是那里给数据流的地方去。

+0

从不建议@@身份,这对数据完整性不利,因为它并不总是返回正确的身份。 Scope_identity是您需要的功能或更好的输出子句。 – HLGEM 2010-05-13 18:22:06

+0

我的问题是添加映射到目标表时,它只显示该人的名字。仍然如何获取生成的personid并将其插入到另一个表中,因为没有其他窗口可用于映射到多个目标表。 – bbbbb 2010-05-14 05:32:11

+0

HLGEM - 你是对的。 @@身份可能不好。我已更正了我的条目并添加了更多详细信息。 – 2010-05-14 20:44:39

0

创建另一个控制流任务和数据流部分,取源表,你作为人表说,PERSONID并插入到目标表这是地址表

+0

你会如何建议将ID从第一个表中取出? – 2016-09-26 06:52:56

0

这一切都取决于你的具体情况。这里有几个可能的原因:

  1. 你有业务键(例如人的名字 - 任何一个唯一标识一个人记录)加载地址表时,可用的人吗?如果是,则使用它在Person表上执行查找。

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

同样,这一切都依赖于,因此上述可能需要适应您的具体情况。我希望它能让你开始。