8

我将给出我当前方法的伪代码示例,如果有人知道一种方法不能一次一行地工作,我将不胜感激。我正在使用 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

4 回答 4

2

您可以使用合并Table1输出到.Table2

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小提琴

注意: 如果Table2针对您定义了外键,Table1则无法直接将输出输出到Table2. Table2在这种情况下,您可以使用临时表作为输出目标并从临时表中插入。

于 2012-10-01T05:35:26.177 回答
0

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


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

于 2010-07-15T14:29:30.437 回答
0

Use IDENTITY_INSERT, a VIEW and an INSTEAD OF trigger, and prepopulated identity values with your insert.

See this SQL Fiddle.

I tried flailing about with various things in the INSTEAD OF trigger to let the T1's identity column be used for T2, but ultimately I failed.

于 2012-09-18T02:57:53.910 回答
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

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

于 2012-09-30T05:44:47.137 回答