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

StackOverflow https://stackoverflow.com/questions/261449

Вопрос

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

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

Думаю, моя общая идея такова:

If the row is found
  update
else
  insert

Что касается проверки существования строки, насколько затратно выполнение инструкции SELECT перед вызовом UPDATE или INSERT?Или лучше просто попробовать UPDATE, проверить количество затронутых строк, а затем выполнить INSERT, если количество затронутых строк равно 0?

Это было полезно?

Решение

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

Другие советы

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

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

  • создать (временную) таблицу
  • заполните свои строки
  • запустите INTERSECT, который идентифицирует существующие строки
  • обновите свою таблицу с их помощью
  • запустите EXCEPT, который идентифицирует новые строки
  • запустите вставку с этими элементами
  • удалить/очистить вашу (временную) таблицу

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top