Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

T-SQL : CTE avec des colonnes d'identité

Vous ne pouvez pas capturer l'identité générée dans le CTE. Vous pouvez cependant insérer toutes les lignes dans la table cible avec null comme ParentID puis mettez à jour ParentID dans une déclaration de mise à jour distincte. Pour ce faire, vous pouvez utiliser merge et une technique décrite ici .

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

Voici un exemple de travail complet sur SE-Data