Мне было интересно, если вы столкнулись с командой T-SQL, аналогичной концепции UPSERT? Выполнение операций INSERT | UPDATE с использованием параметров (1) или (2) представляется слишком сложным и подверженным ошибкам.
ЗАДАЧА
Чтобы гарантировать, что требуемая запись (в данном случае employee_id 1) является актуальной, БЕЗ необходимости по существу писать один и тот же запрос дважды.
КОНТЕКСТ
- Название таблицы: сотрудник
- идентификатор сотрудника: имеет первичный ключ, и для свойства proerty установлено значение true
ПАРАМЕТРЫ
выполнить SQL UPDATE ... check @@ rowcount = 0 и @@ error = 0 ... выполнить SQL INSERT, если требуется
- con: вам фактически нужно написать один и тот же запрос дважды, один раз как вставка, один раз как обновление
- con: больше кода = больше времени печатать
- con: больше кода = больше места для ошибки
/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure "Обновление с использованием @@ rowcount"
- выполнить SQL MERGE
- con: вам фактически нужно написать один и тот же запрос дважды, один раз как вставка, один раз как обновление
- con: больше кода = больше времени печатать
- con: больше кода = больше места для ошибки
http://technet.microsoft.com/en-us/library/bb510625.aspx "Слияние T-SQL"
- выполнить SQL UPSERT (функция не существует)
- pro: вы определяете отношение данных к таблице один раз (пусть SQL Server беспокоится о том, является ли он INSERT или UPDATE)
- за: меньше кода = более быстрая реализация
- за: меньше кода = меньше вероятность
Пример UPSERT
Сотрудник UPSERT (employee_id, employee_number, job_title, first_name, middle_name, фамилия ,ified_at) ЗНАЧЕНИЯ (1, '00 -124AB37 ',' Manager ',' John ',' T ',' Smith ', GetDate ());
- если employee_id 1 не существует: MS SQL выполняет инструкцию INSERT
- если employee_id 1 существует: MS SQL выполняется и оператор UPDATE
источник
MERGE
это просто, гибко, и это также является частью стандарта SQL. Реальная проблема сMERGE
другимиUPSERT
реализациями - это потенциальная эскалация блокировки или даже взаимоблокировка, которая не имеет ничего общего с синтаксисом.MERGE
реализации в SQL Server.Ответы:
Я думаю, что простой ответ на этот вопрос - нет.
MERGE
был ответ Microsoft на более запутаннуюUPSERT
логику. И вы даже не перечислили худший подход:Я просто набросился во рту, немного печатая это, но на самом деле это тот, который я вижу чаще всего.
В любом случае, если
MERGE
вы не обладаете достаточной гибкостью или мощностью, я предлагаю вам отправить запрос в Microsoft по адресу http://connect.microsoft.com/sql/ и подробно объяснить ваш бизнес-кейс. Пока вы придерживаетесь реальных преимуществ предложенного вами синтаксисаMERGE
, у вас есть мой голос. Если вы слишком сильно зависаете от «подверженной ошибкам» части, я вряд ли куплю. Почему? Потому что вы можете жирным пальцем любое утверждение.Тем не менее, я не думаю, что здесь кто-то может что-то сделать специально для вас. Вы должны исследовать потенциальные проблемы с
MERGE
:http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/
источник