Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

T-SQL:CTE с колони за идентичност

Не можете да заснемете генерираната самоличност в CTE. Можете обаче да вмъкнете всички редове в целевата таблица с null като ParentID и след това актуализирайте ParentID в отделно изявление за актуализиране. За да направите това, можете да използвате merge и описана техника тук .

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

Ето пълна работна извадка за SE-Data



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да вмъкнете няколко реда в таблица въз основа на диапазон от числа

  2. Как да замените първия и последния знак на колона в sql сървър?

  3. Лесен начин за транспониране на колони и редове в SQL?

  4. Код за валидиране на SQL скриптове

  5. Защо select SCOPE_IDENTITY() връща десетичен знак вместо цяло число?