我正在尝试将数据从一个数据库传输到一个新数据库。我正在从一个表中获取数据,比如说我获取人员姓名,然后我将其插入到人员表中。这将生成一个 personID,我想将其插入地址表中。使用 SSIS 的方法应该是什么?有什么建议吗?
最佳答案
您有几种方法可以到达这里。
- 如果这是表的一次性初始加载,我建议在插入语句之前使用 SET IDENTITY_INSERT ON。这将允许您自己插入身份,从而无需检索 key 。您必须使用脚本任务或类似任务来创建按键序列。
- 使用 SQL 命令任务执行插入语句,然后执行 SELECT SCOPE_IDENTITY() 将插入标识提取到从 SQL 命令任务返回的参数中。这是有风险的,因为您不能保证 @@identity 来自您的插入。只有当其他用户进行多次插入时,这才是真正的风险。
因此,如果您决定选择#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
条件分割是为了给数据流提供一个去处。
关于SSIS数据转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2825307/