Мені було цікаво, чи стикалися ви з командою T-SQL, подібною до концепції UPSERT? Виконання операцій INSERT | UPDATE з використанням параметрів (1) або (2) здається надмірно складним та схильним до помилок.
МЕТА
Щоб переконатися, що потрібний запис (у даному випадку Employ_id 1) є актуальним БЕЗ необхідності по суті написати один і той же запит двічі.
КОНТЕКСТ
- назва таблиці: працівник
- ідентифікатор співробітника: має первинний ключ, а особистість особистість встановлена на істину
ВАРІАНТИ
виконати оновлення SQL ... перевірити @@ 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 хвилюється про те, чи це ВСТАВКА чи ОНОВЛЕННЯ)
- pro: менше коду = швидша реалізація
- pro: менший код = менша ймовірність
ПЕРЕГЛЯД ПРИМЕР
UPSERT співробітник (служитель_id, службовий номер, посада_тит, ім'я, ім'я, прізвище, прізвище, модифікований_AT) ЗНАЧЕННЯ (1, '00 -124AB37 ',' менеджер ',' Джон ',' T ',' Smith ', GetDate ());
- якщо співробітник_id 1 не існує: MS SQL виконує оператор INSERT
- якщо службовий_id 1 існує: MS SQL виконує та операцію UPDATE
MERGE
це просто, гнучко, і це також є частиною SQL Standard. Справжня проблема з MERGE
іншими UPSERT
реалізаціями - це потенційна ескалація блокування або навіть тупикові місця, що не має нічого спільного з синтаксисом.
MERGE
реалізацію в SQL Server.