Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm thế nào để sao chép bảng tránh con trỏ trong SQL?

Bạn có thể sử dụng mệnh đề đầu ra với câu lệnh hợp nhất để có được ánh xạ giữa id nguồn và id đích. Sử dụng merge..output để ánh xạ giữa source.id và target.id

Đây là một số mã mà bạn có thể kiểm tra. Tôi sử dụng các biến bảng thay vì bảng thực.

Thiết lập dữ liệu mẫu:

-- @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')

Sao chép dữ liệu:

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

Kết quả:

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

Bạn có thể kiểm tra mã tại đây: 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. Cách tăng tốc độ chèn hàng loạt vào MS SQL Server bằng pyodbc

  2. Cách chèn nhiều hàng vào bảng dựa trên một dãy số

  3. Hệ điều hành SQL Server lỗi 5:5 (Quyền truy cập bị từ chối.)

  4. Làm thế nào để sử dụng TimeZoneInfo trong hội SQLCLR trong SQL Server 2012

  5. Cách thêm hoặc thả cột bằng cách sử dụng GUI trong SQL Server - Hướng dẫn sử dụng SQL Server / T-SQL Phần 39