有没有办法将FK从一个到另一个批量插入到两个表中?

时间:2010-07-14 18:07:52

标签: sql-server foreign-keys cursor bulkinsert scope-identity

我将给出一个当前方法的伪代码示例,如果有人知道某个方法一次不能运行一行,我会非常感激。我正在使用MS SQL Server 2008。

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

4 个答案:

答案 0 :(得分:1)

您可以Table1使用mergeTable2使用output

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

答案 1 :(得分:0)

使用这么多数据,最好的选择可能是隔离系统上的更新,允许identity insert并在插入之前预先设置密钥。


或者,您可以只进行第一次插入,然后修改第二次插入(来自临时表)以连接到原始数据并找到密钥。

答案 2 :(得分:0)

使用IDENTITY_INSERT,VIEW和INSTEAD OF触发器,以及插入的预先填充的标识值。

See this SQL Fiddle

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

答案 3 :(得分: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

对于给定的例子,我无法做得更好......