SSIS数据转换

标签 ssis

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

最佳答案

您有几种方法可以到达这里。

  1. 如果这是表的一次性初始加载,我建议在插入语句之前使用 SET IDENTITY_INSERT ON。这将允许您自己插入身份,从而无需检索 key 。您必须使用脚本任务或类似任务来创建按键序列。
  2. 使用 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/

相关文章:

powershell - 从Powershell接收SSIS执行结果

sql - 连接到 "srvrname"上的集成服务失败 : "The specified service does not exist as an installed service."

http - 如何从 SSIS 发出 HTTP 请求?

ssis - 通过 SSIS 的 DB2 中的 WHERE 列 IN 参数

ssis - 为什么在 SQL Server 代理作业中运行的 SSIS 包不会将文件传输到网络文件夹?

sql-server - 在 SQL Server 代理作业中,我应将敏感的加密密码存储在哪里?

sql-server - SSIS 平面文件无法处理 NUL (\x00) 值?

sql-server-2005 - 为什么我的 CASTS 在 SSIS 中似乎被忽略了?

debugging - 您能否在 BIDS 中监视 SSIS 包在服务器上运行时的执行情况?

sql-server - 在 SSIS 2012 中的集成服务目录中设置 "Execute Package Task"中的包路径