Вставка / обновление в SQL Server 2005 без использования хранимых процедур - PullRequest
1 голос
/ 04 ноября 2008

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

Я нашел предыдущий вопрос по теме , но он касается хранимых процедур, которые я не использую. Я хотел бы просто использовать простые операторы SQL SELECT, INSERT и UPDATE, если нет чего-то лучшего (оператор MERGE недоступен в SQL Server 2005).

Полагаю, моя общая идея такова:

If the row is found
  update
else
  insert

Что касается проверки на существование строки, насколько дорого делать оператор SELECT перед вызовом UPDATE или INSERT? Или лучше просто попробовать ОБНОВИТЬ, проверить количество затронутых строк, а затем сделать ВСТАВКУ, если количество затронутых строк равно 0?

Ответы [ 4 ]

7 голосов
/ 04 ноября 2008

Самый эффективный способ - сделать UPDATE, затем сделать INSERT, если @@rowcount равно нулю, , как объяснено в предыдущем ответе .

0 голосов
/ 04 ноября 2008

Полностью понимаю, что ваш пост назывался «SQL Server 2005», но просто хотел выкинуть что-то, чего можно ожидать, если / когда вы обновитесь до SQL 2008. Microsoft добавила новый оператор MERGE, который даст вам возможность кодировать один оператор DML, который выполняет обновление и вставку. Это довольно круто. Я еще не сравнивал производительность и ввод-вывод, но просто здорово иметь еще один инструмент в вашем наборе инструментов.

0 голосов
/ 04 ноября 2008

Если вы всегда собираетесь:
* Подсчитать строки
* Вставить / Обновить на основе результата

Почему бы не вместо:
* Удалить строку
* Вставить строку

Тот же результат и аккуратнее.
Насколько я знаю, когда вы обновляете строку - SQLServer все равно выполняет удаление / вставку (там, где она существует)

0 голосов
/ 04 ноября 2008

(Прежде всего - я бы не пытался избегать хранимых процедур, если нет веской причины. В большинстве случаев это дает хорошую выгоду.)

Вы можете сделать это следующим образом:

  • создать (временную) таблицу
  • заполните ваши строки
  • запустить INTERSECT, который идентифицирует существующие строки
  • обновить таблицу с ними
  • выполнить ИСКЛЮЧЕНИЕ, которое идентифицирует новые строки
  • запустить вставку с этими элементами
  • сбросить / очистить ваш (временный) стол

Вероятно, это будет работать быстрее, если вы вставляете / обновляете большое количество строк.

...