MERGE
blev introduceret i SQL Server 2008. Hvis du vil bruge denne syntaks, skal du opgradere.
Ellers vil den typiske tilgang afhænge af, hvor kildedataene kommer fra. Hvis det kun er én række, og du ikke ved, om du skal opdatere eller indsætte, ville du sandsynligvis gøre:
UPDATE ... WHERE key = @key;
IF @@ROWCOUNT = 0
BEGIN
INSERT ...
END
Hvis din kilde er en #temp-tabel, tabelvariabel, TVP eller anden tabel, kan du gøre:
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);
Som med MERGE
(og som Michael Swart demonstrerede her
), vil du stadig gerne omgive enhver af disse metoder med korrekte transaktioner, fejlhåndtering og isolationsniveau for at opføre sig som en ægte, enkelt operation. Selv en enkelt MERGE
erklæring beskytter dig ikke mod samtidighed.
Jeg har udgivet nogle andre advarsler om FLOT i flere detaljer her .