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

Bagaimana cara menyalin tabel menghindari kursor dalam SQL?

Anda dapat menggunakan klausa keluaran dengan pernyataan gabungan untuk mendapatkan pemetaan antara id sumber dan id target. Dijelaskan dalam pertanyaan ini. Menggunakan merge..output untuk mendapatkan pemetaan antara source.id dan target.id

Berikut adalah beberapa kode yang dapat Anda uji. Saya menggunakan variabel tabel bukan tabel nyata.

Siapkan data sampel:

-- @A and @B is the source tables
declare @A as table
(
  id int,
  FK_A_B int,
  name varchar(10)
)

declare @B as table
(
  id int,
  visible bit
)  

-- Sample data in @A and @B
insert into @B values (21, 1),(32, 0)
insert into @A values (1, 21, 'n1'),(5, 32, 'n2')


-- @C and @D is the target tables with id as identity columns
declare @C as table
(
  id int identity,
  FK_C_D int not null,
  name varchar(10)
)

declare @D as table
(
  id int identity,
  visible bit
)  

-- Sample data already in @C and @D
insert into @D values (1),(0)
insert into @C values (1, 'x1'),(1, 'x2'),(2, 'x3')

Salin data:

-- The @IdMap is a table that holds the mapping between
-- the @B.id and @D.id (@D.id is an identity column)
declare @IdMap table(TargetID int, SourceID int)

-- Merge from @B to @D.
merge @D as D             -- Target table
using @B as B             -- Source table
on 0=1                    -- 0=1 means that there are no matches for merge
when not matched then
  insert (visible) values(visible)    -- Insert to @D
output inserted.id, B.id into @IdMap; -- Capture the newly created inserted.id and
                                      -- map that to the source (@B.id)

-- Add rows to @C from @A with a join to
-- @IdMap to get the new id for the FK relation
insert into @C(FK_C_D, name)
select I.TargetID, A.name 
from @A as A
  inner join @IdMap as I
    on A.FK_A_B = I.SourceID

Hasil:

select *
from @D as D
  inner join @C as C
    on D.id = C.FK_C_D

id          visible id          FK_C_D      name
----------- ------- ----------- ----------- ----------
1           1       1           1           x1
1           1       2           1           x2
2           0       3           2           x3
3           1       4           3           n1
4           0       5           4           n2

Anda dapat menguji kode di sini:https://data.stackexchange.com/stackoverflow/q/101643/using-merge-to-map-source-id-to-target-id



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Layanan SQL Server tidak tersedia dalam daftar layanan setelah instalasi SQL Server Management Studio

  2. Bagaimana cara mengonversi dari tipe data uang di server SQL?

  3. Perlu membuat daftar semua pemicu di database SQL Server dengan nama tabel dan skema tabel

  4. Apakah mungkin untuk menggunakan tipe tabel yang ditentukan pengguna di dalam tipe tabel yang ditentukan pengguna lain di sql

  5. Jumlah menit antara beberapa rentang tanggal