2010-07-14 33 views
7

我会给出我当前方法的一个伪代码示例,如果有人知道一次不能一行工作的方法,我会非常感激。我正在使用MS SQL Server 2008.有没有办法将FK从一个到另一个批量插入到两个表中?

define cursor for the data to be inserted (about 3 million records) 
loop 
(
    insert record into table 1 
    use scope_identity() to get key 
    insert record into table 2 that references table 1 
) 

我宁愿做某种插入到两个表中,因为游标和循环都很慢。

在大家讨论为什么我将某些东西插入到具有1对1关系的两个单独表中之前,这是因为第一个表无法修改,我需要第二个(临时)表中的信息以供数据参考稍后转换操作。

不,我不能添加一个临时列来将参考数据保存到无法修改的表上,因为它无法修改。这是一个实时系统,我无权修改表格。

谢谢!

附加信息:

防爆

Source: 

1 a big monkey 
2 a tall elephant 
3 a big giraffe 
4 a tiny cow 
5 a tall cow 

Dest: 

Table 1  Table 2 
monkey  1 big 
elephant  2 tall 
giraffe  3 big 
cow   4 tiny 
cow   5 tall 
+1

[此答案有帮助吗?](http://stackoverflow.com/q/5365629/73226) – 2012-09-30 20:37:54

回答

0

有这么大的数据,最好的选择可能是在系统上隔离的更新,让identity insert和插入之前prepoulate键。


或者,可你只是做了第一次插入,然后修改为第二插件(从临时表)加入到原始数据,并找到问题的关键。

+0

伟大的想法和谢谢,但...我不能修改第一个表,以允许身份插入。 第二个想法是完美的,但我需要第一个外键的第一个表的原因是因为我插入到第一个表中的数据不包含任何内容以使每条记录都是唯一的。 第二个目标表本质上将包含源表的标识。 请参阅我添加到问题的其他信息。 – AppFzx 2010-07-16 13:39:03

+2

您不需要*修改*表以允许身份插入 - 您只需要用SET IDENTITY_INSERT ON 和SET IDENTITY_INSERT OFF将括号插入语句。 – 2012-09-18 02:19:17

0

使用IDENTITY_INSERT,VIEW和INSTEAD OF触发器,以及预填充的身份值与您的插入。

See this SQL Fiddle

我试着在INSTEAD OF触发器中使用各种东西来让T1的标识列用于T2,但最终我失败了。

0
insert into table1 
select substring(src.data, 8 /* assuming fixed length as exampled */, len(src.data)) 
from source src 

insert into table2 
select t1.id, substring(src.data, 3 /* skip 'a ' */, 7) 
from 
    table1 t1 
     inner join source src 
     on substring(src.data, 8, len(src.data)) = t1.data 

对于给定的例子,我不能做的更好......

+0

啊! t1(data,id)上的索引可能有帮助... – 2012-09-30 05:47:19

1

您可以使用mergeTable1和和outputTable2

merge Table1 
using SourceTable 
on 0 = 1 
when not matched then 
    insert (Animal) values (SourceTable.Animal) 
output inserted.ID, SourceTable.Size into Table2(ID, Size); 

SQL Fiddle

注:如果Table2具有抗Table1定义的外键,你不能直接做输出Table2。在这种情况下,您可以使用临时表作为输出的目标,并从临时表中插入Table2

相关问题