Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

T-SQL:CTE mit Identitätsspalten

Sie können die generierte Identität nicht im CTE erfassen. Sie können jedoch alle Zeilen mit null in die Zieltabelle einfügen als ParentID und aktualisieren Sie dann ParentID in einer separaten Update-Anweisung. Dazu können Sie merge verwenden und eine beschriebene Technik hier .

-- Helper table to map new id's from source
-- against newly created id's in target
declare @IDs table
( 
  TargetID int,
  SourceID int,
  SourceParentID int
)

-- Use merge to capture generated id's
merge BillOfMaterials as T
using SourceTable as S
on 1 = 0
when not matched then
insert (SomeColumn) values(SomeColumn)
output inserted.BomId, S.BomID, S.ParentID into @IDs;

-- Update the parent id with the new id
update T
set ParentID = I2.TargetID
from BillOfMaterials as T
  inner join @IDs as I1
    on T.BomID = I1.TargetID
  inner join @IDs as I2
    on I1.SourceParentID = I2.SourceID

Hier ist ein vollständiges Arbeitsbeispiel für SE-Data