在sql server上迁移header-detail表对

时间:2015-04-16 14:58:37

标签: sql-server output-clause

如何将一些表格(具有IDENTITY ID' s)中的一些记录迁移到另一个数据库中的一对新表?

例如,您需要从标头表及其所有详细信息中迁移编号为4,6,9和10的记录。

当您在新表上插入标题记录时,它们的ID将是1,2,3和4.当插入详细信息时,来自4的子记录将需要指向1,6到2等等。

有没有办法使用OUTPUT子句来包含未插入表中的字段,作为配对" old" ID'到"新"的?

1 个答案:

答案 0 :(得分:0)

OUTPUT语句的INSERT子句只允许您选择实际插入目标表的值。您可以使用MERGE来解决此问题,因为OUTPUT语句的MERGE子句也允许您从源数据中选择值。这是一个例子:

declare @src table (id bigint, data char);
declare @dest table (id bigint identity(1,1), data char);
insert @src values (4, 'A'), (6, 'B'), (9, 'C'), (10, 'D');

insert @dest (data)
    output inserted.id, S.id -- ERROR
    select data from @src S;

merge @dest D
    using @src S on 1 = 0
    when not matched then
        insert (data) values (S.data)
        output inserted.id as [New ID], S.id as [Old ID]; -- LEGAL

MERGE声明的结果:

New ID  Old ID
1       4
2       6
3       9
4       10