Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

T-SQL:CTE com colunas de identidade


Você não pode capturar a identidade gerada no CTE. No entanto, você pode inserir todas as linhas na tabela de destino com null como ParentID e, em seguida, atualize ParentID em uma declaração de atualização separada. Para fazer isso, você pode usar merge e uma técnica descrita aqui .
-- 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

Aqui está um exemplo completo de trabalho em SE-Data