2012-11-16 5 views
5

Tôi đang sử dụng các bảng dàn để thực hiện xác thực và chèn vào trực tiếp.Máy chủ SQL - sao chép dữ liệu từ bảng dàn

Giả sử tôi có một bảng NGƯỜI

TABLE Persons 
(
Id int NOT NULL, 
LastName varchar(255) NOT NULL, 
FirstName varchar(255), 
HouseNumber int, 
) 

dàn TABLE như sau

TABLE Persons_Staging 
(
Id int NOT NULL, 
LastName varchar(255) NOT NULL, 
FirstName varchar(255), 
HouseNumber varchar(255), 
) 

tôi cần phải viết một thủ tục để chuyển dữ liệu từ bảng dàn để bảng trực tiếp trong khi đảm bảo không có bản sao được chèn vào. Làm thế nào tôi có thể đạt được điều đó?

Cảm ơn trước

+1

Tôi đã không làm một cái gì đó như thế này bằng tay trong nhiều năm, và có đến để xem loại nhiệm vụ này hoàn toàn không hiệu quả. Điều này có thể không phải là một lựa chọn cho ngay bây giờ, nhưng về lâu dài, hãy xem xét việc có được một công cụ so sánh cơ sở dữ liệu. Chúng được thiết kế để làm tất cả việc nâng hạng nặng, để bạn tự do tập trung vào công việc phát triển. Tôi sử dụng các công cụ của Redgate. Họ có bản dùng thử miễn phí. http://www.red-gate.com –

Trả lời

9

Sử dụng lệnh MERGE.

Something như thế này:

MERGE 
    INTO Persons AS TARGET 
    USING Persons_Staging AS SOURCE 
    ON TARGET.ID = SOURCE.ID 
    --WHEN MATCHED 
    -- THEN UPDATE??? 
    WHEN NOT MATCHED BY TARGET 
     THEN INSERT (Id , LastName , FirstName, HouseNumber) 
    VALUES (SOURCE.Id , SOURCE.LastName , SOURCE.FirstName, SOURCE.HouseNumber) 
    -- WHEN NOT MATCHED BY SOURCE 
    -- THEN DELETE??? 
; 

Nếu bạn muốn cập nhật hồ sơ hiện tại bạn bỏ ghi chú phần UPDATE và thêm một điều khoản cập nhật phù hợp. Điều tương tự với phần xóa.

+1

+1 trường hợp sử dụng hoàn hảo cho lệnh 'MERGE'! –

+0

Cảm ơn, tôi đã cố gắng làm việc này bằng lệnh MERGE! – dopplesoldner

0

bạn có thể sử dụng tính năng này với phép nối ngoài bên trái trên cả hai bảng để nhận tất cả dữ liệu không giống nhau. dữ liệu mà bạn có thể chèn vào cột của bạn

INSERT INTO Tab1(front,end,number) 
SELECT first,last,nr from tab2 LEFT OUTER JOIN tab1 ON front = first AND last = end AND convert(int,number) = CONVERT(int,nr) 
WHERE tab1.ID is null 

này có thể làm việc, mặt khác có các công cụ thực hiện cho loại công cụ này