Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

T-SQL:CTE dengan kolom identitas

Anda tidak dapat menangkap identitas yang dihasilkan di CTE. Namun Anda dapat menyisipkan semua baris ke tabel target dengan null sebagai ParentID lalu perbarui ParentID dalam pernyataan pembaruan terpisah. Untuk melakukannya, Anda dapat menggunakan merge dan teknik yang dijelaskan di sini .

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

Berikut adalah contoh kerja lengkap di 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. Batasan unik SQL di beberapa tabel

  2. Masukkan Minimal Masuk Ke

  3. Gunakan NEWSEQUENTIALID() untuk Membuat GUID yang Bertambah di SQL Server

  4. bagaimana cara melihat/skrip definisi tampilan sistem?

  5. Cara terbaik untuk menerapkan jejak audit di SQL Server?