SQL Server 2008 e versioni successive hanno un'istruzione MERGE che fa esattamente questo.
Consulta i documenti MSDN Books Online su MERGE per i dettagli.
Fondamentalmente, hai bisogno di quattro cose:
- una fonte (tabella o visualizzazione o istruzione SELECT inline)
- un obiettivo
- un ISCRIVITI condizione che unisce i due
- dichiarazioni per i casi in cui è presente una MATCH (righe esistono sia nell'origine che nella destinazione), NOT MATCHED (quando la riga non esiste ancora nella destinazione) e così via
Quindi in pratica definisci qualcosa come:
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)
Questo viene fatto come un'unica istruzione e altamente ottimizzato da SQL Server.