sql >> Database teknologi >  >> RDS >> Sqlserver

T-SQL:CTE med identitetskolonner

Du kan ikke fange den genererede identitet i CTE. Du kan dog indsætte alle rækker i måltabellen med null som ParentID og opdater derefter ParentID i en separat opdateringserklæring. For at gøre det kan du bruge merge og en teknik beskrevet her .

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

Her er fuld arbejdseksempel på SE-Data



  1. Sammenkædning af tal i virtuelt kolonneudtryk kaster ORA-12899:værdi for stor til kolonne

  2. OPDATERINGER til statistik

  3. Bruger du Docker til at starte webapp, kan du ikke oprette forbindelse til Postgresql DB?

  4. Opret et SQL Server Agent-job i Azure Data Studio