Могу ли я использовать оператор MERGE в SQL Server 2005?

Я использую SQL Server 2005, и я хотел создать оператор или концепцию MERGE в одном запросе в SQL Server 2005. Возможно ли это?

Ответ 1

MERGE был представлен в SQL Server 2008. Если вы хотите использовать этот синтаксис, вам нужно будет обновить.

В противном случае типичный подход будет зависеть от источника исходных данных. Если это только одна строка, и вы не знаете, нужно ли вам обновлять или вставлять, вы, вероятно, сделали бы:

UPDATE ... WHERE key = @key;

IF @@ROWCOUNT = 0
BEGIN
    INSERT ...
END

Если ваш источник представляет собой таблицу #temp, переменную таблицы, TVP или другую таблицу, вы можете сделать:

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);

Как и в MERGE (и как Майкл Сварт продемонстрировал здесь), вы все равно захотите окружить любой из этих методов правильными транзакциями, обработкой ошибок и уровнем изоляции вести себя как настоящая единственная операция. Даже один оператор MERGE не защищает вас от concurrency.

Я опубликовал несколько других предостережений о MERGE более подробно здесь.