SQL Server 2008 och nyare har en MERGE-sats som gör precis det.
Se MSDN Books Online-dokumenten på MERGE för detaljer.
I grund och botten behöver du fyra saker:
- en källa (tabell eller vy eller inline SELECT-sats)
- ett mål
- a GÅ MED villkor som länkar de två
- påståenden för fall då det finns en MATCH (rader finns i både källa och mål), INTE MATCHAD (när rad inte finns i målet ännu) och så vidare
Så du definierar i princip något som:
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)
Detta görs som ett påstående och mycket optimerat av SQL Server.