我将给出一个当前方法的伪代码示例,如果有人知道某个方法一次不能运行一行,我会非常感激。我正在使用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
答案 0 :(得分:1)
您可以Table1
使用merge,Table2
使用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);
注意:如果Table2
的外键定义为Table1
,则无法直接将输出发送到Table2
。在这种情况下,您可以使用临时表作为输出的目标,并从临时表中插入Table2
。
答案 1 :(得分:0)
使用这么多数据,最好的选择可能是隔离系统上的更新,允许identity insert
并在插入之前预先设置密钥。
或者,您可以只进行第一次插入,然后修改第二次插入(来自临时表)以连接到原始数据并找到密钥。
答案 2 :(得分:0)
使用IDENTITY_INSERT,VIEW和INSTEAD OF触发器,以及插入的预先填充的标识值。
我试着在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
对于给定的例子,我无法做得更好......