Вставка/обновление в SQL Server 2005 без использования хранимых процедур
-
06-07-2019 - |
Вопрос
Я пытаюсь реализовать классический сценарий вставки/обновления, в котором мне нужно обновить существующие строки в базе данных или вставить их, если их там нет.
Я нашел предыдущий вопрос по теме, но он касается хранимых процедур, которые я не использую.Я хотел бы просто использовать простые операторы 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 в любом случае выполняет удаление / вставку (там, где она существует)