2012-11-16 40 views
5

我正在使用臨時表執行驗證並插入到現場。SQL Server - 從臨時表中複製數據

假設我有一個表PERSONS

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

臨時表如下

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

我需要編寫一個程序以從臨時表將數據傳輸到直播表,同時確保沒有插入重複項。我怎樣才能做到這一點?

在此先感謝

+1

我沒有做過這樣的事情手動多年,並有認爲這種任務完全沒有成果。這可能不是現在的選擇,但長期來看,考慮獲得數據庫比較工具。這些旨在完成所有繁重的工作,讓您可以自由地專注於開發工作。我使用Redgate的工具。他們有免費試用。 http://www.red-gate.com –

回答

9

使用MERGE命令。

事情是這樣的:

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

如果您想更新現有記錄您取消註釋UPDATE部分,並添加適當的更新條款。與刪除部分相同。

+1

+1 MERGE命令的完美使用案例! –

+0

謝謝,我設法讓這個工作使用MERGE命令! – dopplesoldner

0

你可以在兩個表上使用左外連接來獲取所有不相同的數據。這些數據,可以隨後插入到列

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 

這可能是工作,而另一方面也有對這種東西製成的工具