我是SSIS的新手。我有来自单一来源的数据。我需要将这些数据输入到几个表中(这些表与外键关系相关)。我正在使用多播将数据输入多个目的地。
我的问题是......
如何获取某个目的地的条目标识并将该标识用于第二个目的地的外键列?
这是我正在寻找的一个例子。 Employee表具有Address表的外键。但来源包括所有这些信息。将数据输入2个不同的位置很容易。但是当我将信息输入Employee表时,我需要Address表中的标识。我如何获得该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...
答案 0 :(得分:2)
简短的回答是,开箱即用,SSIS不是为此而构建的。将数据置于表中后,目标组件不允许发送输出流。
你可以使用OLE DB Command
伪造这种行为,但是你的性能会低于好,因为它会为流经数据流的每一行发出一个单例插入语句。通常,引擎会尝试批处理N个工作单元,并对数据执行批量的,基于集合的操作以获得更高的吞吐量。您还可以使用Script Component
执行此操作。同样的表现警告仍然适用。
更好的选择可能是将数据放入临时表,然后在Execute SQL Task
之后使用Data flow
并使用INSERT操作的OUTPUT子句来捕获这些身份和然后将它们修补到你的另一张表中。
答案 1 :(得分:1)
我尝试使用像你这样的任务的另一种方法是人工生成父表的ID字段。这里的想法是知道前面的ID,以便您可以分配外键值。
然后,不是使用多播,而是按顺序加载数据:parent,然后是child。对于父表,请勾选Keep Identity属性(OLEDB目标)。
答案 2 :(得分: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 - 将数据加载到舞台表
---执行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 ---填充员工表
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])
;
答案 3 :(得分:0)