4

我是 SSIS 的新手。我有来自单一来源的数据。我需要将该数据输入到几个表中(这些表通过外键关系相关)。我正在使用多播将数据输入到多个目的地。

我的问题是...

如何获取进入一个目的地的条目的身份并将该身份用于第二个目的地的外键列?

这是我正在寻找的一个例子。Employee 表有一个指向 Address 表的外键。但来源包括所有这些信息。将数据输入到 2 个不同的位置很容易。但是当我将信息输入员工表时,我需要地址表中的身份。我如何获得该 ID?

来源(Excel 文件)

Name        Street           State        etc...
----        ------           -----
Jim         12345 Plain St.  CA
Bob         54321 Main St.   CA
etc.

目的地

   Address        Employee
   -------        -------
PK AddressId   PK EmployeeId
   Street      FK AddressId
   State          Name
   etc...         etc...
4

4 回答 4

3

我会尝试使用像您这样的任务的另一种方法是人为地为父表生成 ID 字段。这里的想法是提前知道 ID,以便您可以分配外键值。

然后不使用多播,而是按顺序加载数据:父级,然后是子级。对于父表,勾选 Keep Identity 属性(OLEDB Destination)。

于 2013-07-08T18:21:17.560 回答
2

简短的回答是,开箱即用的 SSIS 并不是为此而构建的。一旦将数据放入表中,目标组件就不允许发送输出流。

您可以使用 an 来伪造此行为,OLE DB Command但您的性能将不太好,因为它将为流经数据流的每一行发出一个单例插入语句。通常,引擎会尝试批量处理 N 个工作单元并对数据执行批量、基于集合的操作以获得更多吞吐量。您也可以使用 aScript Component来执行此操作。同样的性能警告仍然适用。

更好的选择可能是将您的数据放入临时表中,然后Execute SQL Task在您的后面Data flow使用并使用 INSERT 操作的OUTPUT子句来捕获这些身份,然后将它们修补到您的另一个表中。

于 2013-07-08T16:50:10.547 回答
0

暂存表

CREATE TABLE [dbo].[Stage](
    [Name] [varchar](50) NULL,
    [Street] [varchar](50) NULL,
    [State] [varchar](50) NULL,
    [pkAddressID] [int] NULL
) ON [PRIMARY]

GO

地址表

CREATE TABLE [dbo].[Address](
    [pkAddressID] [int] IDENTITY(1,1) NOT NULL,
    [street] [varchar](50) NULL,
    [state] [varchar](50) NULL
) ON [PRIMARY]

-- 员工表

CREATE TABLE [dbo].[Employee](
    [pkEmployeeID] [int] IDENTITY(1,1) NOT NULL,
    [fkAddressID] [int] NULL,
    [Name] [varchar](50) NULL
) ON [PRIMARY]

GO

--- DFT - 将数据加载到 Stage 表中

--- 执行 SQL 任务 1 --- 填充地址表

Merge [dbo].[Address] as target
using
(
    select distinct [Street], [State] from [dbo].[Stage]
) as source
on  source.[Street] = target.[Street] and source.[State] = target.[State]

when not matched then
insert ([Street], [State])
values (source.[Street], source.[State])
;

--- 执行 SQL 任务 2 --- 填充阶段表//pkAddressID 列

Merge [dbo].[Stage] as target
using
(
    select [pkAddressID],[Street], [State] from [1Address]
) 
as source 
on source.[Street] = target.[Street] and source.[State] = target.[State]

when matched then
update
set target.[pkAddressID] = source.[pkAddressID]
;

--- 执行 SQL 任务 3 --- 填充 Employee 表

Merge [dbo].[Employee] as target
using
(
    select [pkAddressID], [Name] from [dbo].[1Stage]
) as source
on source.[pkAddressID] = target.[fkAddressID]
and source.[Name] = target.[Name]

when not matched then
insert ([fkAddressID], [Name])
values (source.[pkAddressID], source.[Name])
;
于 2013-07-09T18:35:35.150 回答
0

The INSERT statement conflicted with the FOREIGN KEY constraint ...使用 Multicast 插入两个相关表时克服错误的另一种方法是清除Check constraints相关选项OLE DB Destination检查 OLE DB 目标中的约束选项

于 2016-01-20T06:58:33.090 回答