2013-09-05 64 views
2

我试过寻找这一个答案无济于事。这种方式背后没有好的逻辑。这个人不知道他在做什么,但这是我必须要处理的事情(长话短说)。我使用SQL Server 2008R2我需要从一个表中记录数据并将数据传输到4个独立的表格,所有这些表格都有一对一的关系(我知道 - 并不聪明)。我需要从数据插入的第一个表中的Identity字段获取值,然后使用相同的ID填充其他3个表并相应地分散数据。例如:如何从一个表中获取ID并将其与SQL Server中另一个表中的记录相关联

OldTable:字段1,字段2,字段3,字段4

NewTable1:标识字段,字段1 NewTable2:ID,字段2 NewTable3:ID,字段3 NewTable4:ID,字段4

I” d喜欢在存储过程中处理这个问题。我想做一个循环,但我读过SQL中的循环是不合适的。

Loop moving through each record in OldTable... (??) 

INSERT INTO NewTable1 
    (Field1) 
Select Field1 from OldTable 

    INSERT INTO NewTable2 
    (ID, Field2) 
    Select SCOPE_IDENTITY?, Field2 From OldTable Where OldTable.ID = ?? 

    etc for other 2 tables 

Loop to next record in OldTable 

我不知道如何使用SCOPE_IDENTITY,但我有一种感觉,这将涉及到我如何做到这一点。

此外,我很可能需要为在NewTable1中创建新记录时设置触发器。我知道,这是疯狂,但我无能为力,只能解决它。

所以,我需要知道 1:最初填充表的最佳方式 2:如何使触发新记录

1的解决方案可能涉及2.

请帮帮忙!

+0

是任何一列或多列在OldTable组合主键或独特之处? –

+0

是的,我想可以用那个PK把它们联系起来。不过,该字段并未存储在新表中。什么是我可以使用它的好方法? – user2751304

回答

0

如何使用插入语句的OUTPUT子句?假设字段1是上OldTable唯一键...

Declare @IDinserted table(ID int, Field1 varchar(255)); 

Insert Into NewTable1(Field1) 
Output inserted.ID, inserted.Field1 into @IDinserted 
Select OldID, Field1 from OldTable; 

Insert Into NewTable2(RowID, Field2) 
Select i.ID, [email protected] 
from @IDinserted i Inner Join OldTable o 
    on i.Field1=o.Field1; 
2

您可以使用MERGE语句的输出子句,以获得在OldTable现有的主键,在NewTable1新生成的身份ID之间的映射。

-- Temp table to hold the mapping between OldID and ID 
create table #ID 
(
    OldID int primary key, 
    ID int 
); 

-- Add rows to NewTable1 and capture the ID's in #ID 
merge NewTable1 as T 
using OldTable as S 
on 1 = 0 
when not matched by target then 
    insert(Field1) values(S.Field1) 
output S.ID, inserted.ID into #ID(OldID, ID); 

-- Add rows to NewTable2 using #ID to get the correct value for each row 
insert into NewTable2(ID, Field2) 
select I.ID, O.Field2 
from #ID as I 
    inner join OldTable as O 
    on I.OldID = O.ID 

insert into NewTable3(ID, Field3) 
select I.ID, O.Field3 
from #ID as I 
    inner join OldTable as O 
    on I.OldID = O.ID 

insert into NewTable4(ID, Field4) 
select I.ID, O.Field4 
from #ID as I 
    inner join OldTable as O 
    on I.OldID = O.ID 

drop table #ID; 

SQL Fiddle

参见Using merge..output to get mapping between source.id and target.id

相关问题