我正在尝试将数据从一个数据库传输到一个新数据库。我从一个表中获取数据说我取了人的名字,然后我把它插入表人。这将生成一个我想插入到地址表中的personID。应该使用SSIS的方法是什么。有什么建议吗?
答案 0 :(得分:4)
你有几种方法可以去这里。
因此,如果您决定选择#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)
这完全取决于您的具体情况。以下是几种可能性:
在加载地址表时,您是否拥有可用人员的业务密钥(例如,人员姓名 - 唯一标识人员记录的任何内容)?如果是,请使用它在Person表上执行查找。
或者您是否正在寻找为新创建的人员创建新地址记录的方法?在这种情况下,理想的情况是您在Person表中有一个Created datetime字段,该字段将在插入Persons时被填充。然后,您可以使用该时间戳来检索所有人员ID,例如,所有人员记录都已创建>地址表的最大创建时间戳。
同样,这完全取决于以上内容可能需要根据您的具体情况进行调整。我希望它能让你开始。