SQL Server 2008 e mais recentes têm uma instrução MERGE que faz exatamente isso.
Consulte os documentos do MSDN Books Online sobre MERGE para detalhes.
Basicamente, você precisa de quatro coisas:
- uma fonte (tabela ou exibição ou instrução SELECT embutida)
- um alvo
- um INSCREVA-SE condição que liga os dois
- instruções para casos em que há um MATCH (existem linhas na origem e no destino), NOT MATCHED (quando a linha ainda não existe no destino) e assim por diante
Então você basicamente define algo como:
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)
Isso é feito como uma instrução e altamente otimizado pelo SQL Server.