Мне было интересно, если вы столкнулись с командой 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.