SSIS数据转换

SSIS数据转换,ssis,Ssis,我正在尝试将数据从一个db传输到一个新的db。我从一个表中提取数据,比如我提取person的名字,然后我将其插入到person表中。这将生成一个personID,我想将它插入到say Address表中。使用SSI的方法应该是什么。有什么建议吗?我建议使用两个单独的数据流,第一个数据流从数据库中加载person表?源表和第二个表将用person id加载您的地址表。您有两种方法可以使用这里 如果这是表的一次性初始加载,我会在INSERT语句之前使用SET IDENTITY_INSERT ON重新

我正在尝试将数据从一个db传输到一个新的db。我从一个表中提取数据,比如我提取person的名字,然后我将其插入到person表中。这将生成一个personID,我想将它插入到say Address表中。使用SSI的方法应该是什么。有什么建议吗?

我建议使用两个单独的数据流,第一个数据流从数据库中加载person表?源表和第二个表将用person id加载您的地址表。

您有两种方法可以使用这里

如果这是表的一次性初始加载,我会在INSERT语句之前使用SET IDENTITY_INSERT ON重新结束。这将允许您自己插入标识,因此无需检索密钥。您必须使用脚本任务或类似的任务来创建密钥序列。 使用SQL命令任务执行insert语句,然后执行SELECT SCOPE_标识,将insert的标识提取到从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];
用两个条目填写人员表:

创建一个存储过程来执行插入并返回新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包。在此示例包中,添加单个数据流任务。在数据流任务中,添加以下任务并将其连接起来,如图所示

请注意,数据查看器将在我们进行过程中向您显示结果

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

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

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

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

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

OLE DB命令调用我们的存储过程,该存储过程在最后一个参数中插入并重新输入新行的id。然后将返回的id映射到我们为其预先指定的数据流中的列中


有条件拆分是为了让数据流在某个地方运行。

创建另一个控制流任务,并在数据流部分,从源表(称为Person表)中提取personid,然后插入到目标表(地址表)中。这一切都取决于您的具体情况。以下是几种可能性:

在加载地址表时,您是否有业务密钥(例如人名)-唯一标识该人的人名记录的任何内容?如果是,则使用该选项在Person表上执行查找

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


同样,这一切都取决于您的具体情况,因此上述情况可能需要一些调整。不过,我确实希望它能让您开始使用。

千万不要建议使用@@identity,它不利于数据完整性,因为它并不总是返回正确的标识。Scope_identity是您需要的函数,最好是output子句。我的问题是,在向目标表添加映射时,它只显示人员的姓名。但我如何获取生成的personid并将其插入另一个表中,因为没有其他窗口可用于映射到多个目标表。HLGEM-您是正确的@@身份可能不好。我已经更正了我的条目并添加了更多的细节。我正在尝试这样做,对图片的引用似乎被破坏了。请你调查一下好吗。谢谢您打算如何从第一个插入的表中获取人员id?您打算如何从第一个表中获取id?