我假设您要复制表层次结构中的数据子集。我所说的层次结构是指通过外键在这个词的明显意义上相互关联的表。例如,Customers
将是一个根表、Orders
它的一个子表和OrderDetails
另一个子表(在第 3 级)。
首先我们复制层次结构的根表:
MERGE RootTable as target
USING (
SELECT *
FROM RootTable
WHERE SomeCondition
) AS src
ON 1=2 -- this is so that all rows that do not match will be added
WHEN NOT MATCHED THEN INSERT (AllColumns) VALUES (AllColumns)
OUTPUT src.ID as OldID, INSERTED.ID as NewID INTO #RootTableMapping
现在我们有一个 1 到 1 的复制源和复制目标 ID 的映射#RootTableMapping
。此外,所有根行都被复制。
我们现在需要复制所有子表。这是一个声明:
MERGE ChildTable as target
USING (
SELECT *, #RootTableMapping.NewID AS NewParentID
FROM ChildTable
JOIN #RootTableMapping ON ChildTable.RootID = #RootTableMapping.OldID
WHERE SomeCondition
) AS src
WHEN NOT MATCHED THEN INSERT (AllColumns, RootID) VALUES (AllColumns, NewParentID)
在这里,我们为每个子行获取克隆的根表行的 ID,以便我们可以链接层次结构。为此,我们使用#RootTableMapping
. NewID
我们复制所有未修改的列,除了我们用映射替换的父 ID 之外。
每个子表都需要一个这样MERGE
的语句。该概念还通过添加额外的连接扩展到具有超过 2 个级别的层次结构。除底层外的所有层级都必须记录copy-source ID到copy-target ID的映射,以允许下一层获取新的ID。
如果我没有把一切都说清楚,请随时提出进一步的问题。我知道这是一个粗略的草图。