SQL Server 2008 und neuer haben eine MERGE-Anweisung, die genau das tut.
Siehe die MSDN Books Online-Dokumentation zu MERGE für Details.
Grundsätzlich benötigen Sie vier Dinge:
- eine Quelle (Tabelle oder Ansicht oder Inline-SELECT-Anweisung)
- ein Ziel
- einen JOIN Bedingung, die die beiden verbindet
- Anweisungen für Fälle, in denen eine ÜBEREINSTIMMUNG vorliegt (Zeilen existieren sowohl in der Quelle als auch im Ziel), NICHT ÜBEREINSTIMMT (wenn die Zeile noch nicht im Ziel vorhanden ist) und so weiter
Sie definieren also im Grunde etwas wie:
MERGE (targettable) AS t
USING (sourcetable) AS s
ON (JOIN condition between s and t)
WHEN MATCHED THEN
UPDATE SET t.Col1 = s.Col1, t.Col2 = s.Col2 (etc.)
WHEN NOT MATCHED THEN
INSERT(Col1, Col2, ..., ColN) VALUES(s.Col1, s.Col2, ......, s.ColN)
Dies erfolgt als eine Anweisung und wird von SQL Server hochgradig optimiert.