sql >> Databáze >  >> RDS >> Sqlserver

T-SQL:CTE se sloupci identity

Nemůžete zachytit vygenerovanou identitu v CTE. Můžete však vložit všechny řádky do cílové tabulky pomocí null jako ParentID a poté aktualizujte ParentID v samostatném aktualizačním prohlášení. K tomu můžete použít merge a technika popsaná zde .

-- 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

Zde je úplná pracovní ukázka na SE-Data



  1. Nástroj pro obnovu zálohy SQL k opravě poškozené zálohy SQL – Recenze produktu – Příspěvek hosta od Daniela Jonese

  2. Jak je zpracováno časové pásmo v životním cyklu ADO.NET + SQL Server sloupec DateTime?

  3. Jak sečíst konkrétní sloupec s měsícem a rokem

  4. Co je dynamické SQL?