Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

T-SQL:CTE z kolumnami tożsamości

Nie możesz przechwycić wygenerowanej tożsamości w CTE. Możesz jednak wstawić wszystkie wiersze do tabeli docelowej za pomocą null jako ParentID a następnie zaktualizuj ParentID w osobnym oświadczeniu aktualizacyjnym. Aby to zrobić, możesz użyć merge oraz technikę opisaną tutaj .

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

Oto pełna próbka działająca na 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. Wewnętrzne łączenie trzech stołów

  2. Przekroczono poziom zagnieżdżenia wyzwalacza?

  3. Jak przekonwertować wartości wierszy na kolumny z dynamiczną liczbą kolumn?

  4. Jak wybrać rekordy, które nie istnieją na serwerze SQL?

  5. Dynamiczny obrót T-SQL