MERGE
a été introduit dans SQL Server 2008. Si vous souhaitez utiliser cette syntaxe, vous devrez effectuer une mise à niveau.
Sinon, l'approche typique dépendra de l'origine des données source. S'il ne s'agit que d'une ligne et que vous ne savez pas si vous devez mettre à jour ou insérer, vous feriez probablement :
UPDATE ... WHERE key = @key;
IF @@ROWCOUNT = 0
BEGIN
INSERT ...
END
Si votre source est une table #temp, une variable de table, TVP ou une autre table, vous pouvez faire :
UPDATE dest SET ...
FROM dbo.destination AS dest
INNER JOIN dbo.source AS src
ON dest.key = src.key;
INSERT dbo.destination SELECT ... FROM dbo.source AS src
WHERE NOT EXISTS (SELECT 1 FROM dbo.destination WHERE key = src.key);
Comme avec MERGE
(et comme Michael Swart l'a démontré ici
), vous souhaiterez toujours entourer l'une de ces méthodes avec des transactions, une gestion des erreurs et un niveau d'isolement appropriés pour qu'elle se comporte comme une véritable opération unique. Même un seul MERGE
déclaration ne vous protège pas de la concurrence.
J'ai publié quelques d'autres précautions concernant MERGE dans plus de détails ici .