是的,該sproc會工作。對該表使用FULL JOIN並添加一列以指示插入,更新或刪除。然後根據列指示符爲它們創建單獨的SQL語句。基於設置。
對不起,沒有一個完整的聯接,你需要把它們分開來分開左和右聯接。在記事本這樣做,所以道歉,如果它不工作:
INSERT INTO tempDeployData(ID,IUDType)
SELECT ed.id, 'D'
FROM tmpDeployData td
RIGHT JOIN existingData ed ON td.id = ed.id
WHERE td.id IS NULL
UPDATE td
SET td.IUDType = CASE WHEN ed.id IS NULL THEN
'I'
ELSE
'U'
END
FROM tmpDeployData td
LEFT JOIN existingData ed ON td.id = ed.id
INSERT INTO existingData(ID,a,b,c)
SELECT td.ID,td.a,td.b,td.c
FROM tmpDeployData td
WHERE td.IUDType = 'I'
DELETE ed
FROM existingData ed
INNER JOIN tmpDeployData td ON ed.ID = td.ID
WHERE td.IUDType = 'D'
UPDATE ed
SET ed.a = td.a,
ed.b = td.b,
ed.c = td.c
FROM existingData ed
INNER JOIN tmpDeployData td ON ed.ID = td.ID
WHERE td.IUDType = 'U'
剛剛意識到你拉的信息到不是Temptable作爲一個臨時表,而不是數據的來源。在這種情況下,您可以使用FULL JOIN:
INSERT INTO tmpDeployData(ID,a,b,c,IUDType)
SELECT sd.ID,
sd.a,
sd.b,
sd.c
'IUDType' = CASE WHEN ed.id IS NULL THEN
'I'
WHEN sd.id IS NULL THEN
'D'
ELSE
'U'
END
FROM sourceData sd
FULL JOIN existingData ed ON sd.id = ed.id
然後與之前相同的DML語句。
來源
2010-06-11 00:44:24
TyT
聽起來像使用SQL Server複製的候選人? – 2010-06-11 01:19:56
我昨天剛剛問了一個類似的問題(但不是相同的)。我選擇使用Visual Studio 2010數據比較。 http://stackoverflow.com/questions/3012544/t-sql-is-there-a-free-way-to-compare-data-in-two-tables – RPM1984 2010-06-11 01:24:57
我沒有選擇數據比較和我們仍然在SQL Server 2005上(所以沒有T-SQL MERGE)。由於我們只定期部署(有時每週一次,有時一個月一次),並且生產數據應該在這些時間之外保持不變,複製也不會有好處。 – 2010-06-11 01:31:49