Эквивалент SQL Server 2000 для ключа ON DUPLICATE?

Существует ли функциональный эквивалент SQL Server 2000 для предложения MySQL ON DUPLICAT KEY? Этот ответ заставил меня посмотреть на конструкцию вместо триггера, но образец выглядит неуклюжим, и функциональность будет скрыта в триггере и не будет находиться непосредственно в сохраненной Proc.

FWIW: Я пытаюсь создать таблицу статистики для минутных сводок, так что я могу просто вызвать одну процедуру для регистрации факта, что произошло действие и увеличил счетчик на соответствующую минуту.

Ответ 1

Я использую это:

begin tran;

update ... where ... ;

if @@rowcount = 0
  insert ...
commit tran;

Как я понимаю, при наличии правильных индексов обновление устанавливает правильные блокировки диапазона, которые не позволяли бы другим вставлять одну и ту же вещь одновременно.

Ответ 2

upsert

http://en.wikipedia.org/wiki/Upsert

INSERT ... WHERE NOT EXISTS (SELECT 1 FROM table WHERE id = ?)

слияния

но я думаю, что это только в SQL 2003

MERGE INTO table_name USING table_name ON (condition)
  WHEN MATCHED THEN
  UPDATE SET column1 = value1 [, column2 = value2 ...]
  WHEN NOT MATCHED THEN
  INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...])

http://en.wikipedia.org/wiki/Merge_(SQL)

Ответ 3

Также неудобно, но вы можете сделать это в своей процедуре:

insert ... where not exists (...);

update ....;

зная, что ваша вставка будет срабатывать, когда данные будут новыми, и ваше обновление будет только тогда, когда данные существуют.