我试过寻找这个答案但无济于事。设置方式背后没有好的逻辑。这家伙不知道他在做什么,但这是我必须要合作的(长篇故事)。
我正在使用SQL Server 2008R2我需要从一个表中获取记录并将数据传输到4个单独的表,所有表都具有一对一的关系(我知道 - 不聪明)。我需要从插入数据的第一个表中的Identity字段中获取值,然后使用相同的ID填充其他3个表并相应地分散数据。例如:
OldTable:Field1,Field2,Field3,Field4
NewTable1:身份字段,Field1 NewTable2:ID,Field2 NewTable3:ID,Field3 NewTable4:ID,Field4
我想在存储过程中处理这个问题。我想做一个循环,但我读到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 :(得分:2)
您可以使用merge语句的output子句来获取OldTable
中现有主键与ID
中新生成的标识NewTable1
之间的映射。
-- 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;
另见Using merge..output to get mapping between source.id and target.id
答案 1 :(得分:0)
如何使用insert语句的OUTPUT子句?假设Field1是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, o.@Field2
from @IDinserted i Inner Join OldTable o
on i.Field1=o.Field1;