Merge (transact-sql)

Вказує певний в області інструкції MERGE тимчасовий іменований результуючий набір або уявлення, які називаються узагальненим табличним виразом. Результуючий набір, на який посилається інструкція MERGE, є похідним простого запиту. Додаткові відомості див. У розділі WITH обобщенное_таблічное_вираженіе (Transact-SQL).

TOP (expression) [PERCENT]

Вказує кількість або відсоток рядків, які підпадають під цю операцію. Вираз expression може бути або числом, або відсотковою часткою рядків. Рядки, на які посилається вираз TOP, які не розташовані в певному порядку. Додаткові відомості див. У розділі TOP (Transact-SQL).

Ім'я бази даних, в якій розташована таблиця target_table.

Ім'я схеми, якій належить таблиця target_table.

Таблиця або уявлення, з якими виконується зіставлення рядків даних з таблиці за умовою . Параметр target_table є цільовим об'єктом будь-яких операцій вставки, оновлення або видалення, зазначених пропозиціями WHEN інструкції MERGE.

Якщо аргумент target_table є поданням, то всі дії, що виконуються з ним, повинні відповідати умовам для поновлення уявлень. Додаткові відомості див. У розділі Зміна даних через подання.

Таблиця target_table не може бути віддаленою, і для неї не можуть бути визначені правила.

Альтернативне ім'я, яке використовується для вказівки посилань на цю таблицю.

Вказується джерело даних, який зіставляється з рядками даних в таблиці target_table на основі умови . Результат цього збігу обумовлює дії, які виконуються пропозиціями WHEN інструкції MERGE. аргумент може бути віддаленої таблицею або похідною таблицею, яка звертається до віддалених таблицях.

аргументом може бути похідна таблиця, яка використовує конструктор табличних значень Transact-SQL для побудови таблиці шляхом вказівки декількох рядків.

Додаткові відомості про синтаксис і аргументах цієї пропозиції см. В розділі FROM (Transact-SQL).

Вказуються умови, при яких таблиця з'єднується з таблицею target_table для зіставлення.

Важливо вказати тільки ті стовпці з цільової таблиці, які використовуються для пошуку збігів. Іншими словами, необхідно вказати стовпці цільової таблиці, які порівнюються з відповідним стовпцем вихідної таблиці. Не рекомендується підвищувати продуктивність запиту за рахунок фільтрації рядків в цільовій таблиці в реченні ON, як при вказівці AND NOT target_table.column_x = value. Це може привести до отримання непередбачених і невірних результатів.

WHEN MATCHED THEN

Вказується, що всі рядки target_table. які відповідають рядкам, повернутим ON , і задовольняють додатковим умовам пошуку, оновлюються або видаляються відповідно до пропозиції .

Інструкція MERGE може мати трохи більше двох пропозицій WHEN MATCHED. Якщо вказані дві пропозиції, перше речення має супроводжуватися пропозицією AND . Для будь-якого рядка друге речення WHEN MATCHED застосовується тільки в тих випадках, якщо не застосовується перше. Якщо є дві пропозиції WHEN MATCHED, одне повинно вказувати дію UPDATE, а інше - дію DELETE. Якщо дія UPDATE зазначено в пропозиції і більше за один рядок в відповідає рядку в target_table на основі , то SQL Server повертає помилку. Інструкцію MERGE не можна використовувати для оновлення одного рядка більше одного разу, а також використовувати для оновлення та видалення однієї і тієї ж рядки.

WHEN NOT MATCHED [BY TARGET] THEN

Вказує, що рядок вставлена ​​в таблицю target_table для кожного рядка, повернутої виразом ON , яка не відповідає рядку в таблиці target_table. але задовольняє додатковій умові пошуку (за наявності такого). Значення для вставки вказуються за допомогою пропозиції . Інструкція MERGE може мати тільки одну пропозицію WHEN MATCHED.

WHEN NOT MATCHED BY SOURCE THEN

Вказується, що всі рядки target_table. які не відповідають рядкам, повернутим ON , і задовольняють додатковим умовам пошуку, оновлюються або видаляються відповідно до пропозиції .

Інструкція MERGE може мати не більше двох пропозицій WHEN NOT MATCHED BY SOURCE. Якщо вказані дві пропозиції, то перше речення має супроводжуватися пропозицією AND . Для будь-якої обраної рядки друге речення WHEN NOT MATCHED BY SOURCE застосовується тільки в тих випадках, якщо не застосовується перше. Якщо є дві пропозиції WHEN NOT MATCHED BY SOURCE, то одне повинно вказувати дію UPDATE, а інше - дію DELETE. В умови можна посилатися лише на стовпці цільової таблиці.

Якщо рядки не повертаються таблицею , до стовпців у вихідній таблиці не може бути надано доступ. Якщо операції оновлення або видалення вказуються в , пропозиція посилається на вихідну таблицю і повертається помилка 207 (неприпустиме ім'я стовпця). Наприклад, пропозиція WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1 може стати причиною помилки інструкції через недоступність стовпчика Col1 у вихідній таблиці.

Вказується будь-яке дійсне умова пошуку. Додаткові відомості див. У розділі Умова пошуку (Transact-SQL).

Вказується одна або кілька табличних підказок, які застосовуються в цільовій таблиці для кожної операції вставки, оновлення або видалення, які виконуються інструкцією MERGE. Необхідно використовувати ключове слово WITH і круглі дужки.

Використання аргументів NOLOCK і READUNCOMMITTED заборонено. Додаткові відомості про таблиць підказках см. В розділі Табличні підказки (Transact-SQL).

Вказівка ​​підказки TABLOCK для цільової таблиці інструкції INSERT призведе до тих самих наслідків, що і вказівка ​​підказки TABLOCKX. До таблиці буде застосована монопольна блокування. Якщо вказано FORCESEEK, то воно застосовується до явного примірнику цільової таблиці, з'єднаної з вихідною таблицею.

Вказівка ​​READPAST з пропозицією WHEN NOT MATCHED [BY TARGET] THEN INSERT може привести до виконання операцій INSERT, які порушують обмеження UNIQUE.

INDEX (index_val [. N])

Вказується ім'я або ідентифікатор одного або декількох індексів цільової таблиці для виконання явного з'єднання з вихідною таблицею. Додаткові відомості див. У розділі Табличні підказки (Transact-SQL).

Повертає рядок для кожного рядка в target_table. яка оновлюється, вставляється або віддаляється без певного порядку. Додаткові відомості про аргументи цієї пропозиції см. В розділі Пропозиція OUTPUT (Transact-SQL).

OPTION ( [. n])

Вказує, що для налаштування способу, яким компонент Database Engine обробляє інструкцію, використовуються підказки оптимізатора. Додаткові відомості див. У розділі Підказки в запитах (Transact-SQL).

Вказує дію поновлення або видалення, яке застосовується до всіх рядків target_table. що не відповідає рядкам, які повертаються ON і задовольняють будь-яким додатковим умовам пошуку.

UPDATE SET

Вказується список імен стовпців або змінних, які необхідно оновити в цільовій таблиці, і значень, які необхідно використовувати для їх поновлення.

Додаткові відомості про аргументи цієї пропозиції див. Розділ UPDATE (Transact-SQL). Присвоєння змінної того ж значення, що і колонки, не дозволяється.

Вказується, що рядки, що збігаються з рядками в target_table. видаляються.

Вказуються значення для вставки в цільову таблицю.

Список, що складається з одного або декількох стовпців цільової таблиці, в які вставляються дані. Стовпці необхідно вказувати у вигляді однокомпонентного імені, так як в противному випадку інструкція MERGE повертає помилку. Аргумент column_list повинен бути укладений в дужки і розділений комами.

Список з роздільниками-комами констант, змінних або виразів, які повертають значення для вставки в цільову таблицю. Вирази не можуть містити інструкцію EXECUTE.

Заповнює вставлену рядок значеннями за замовчуванням, визначеними для кожного стовпчика.

Додаткові відомості про цю пропозицію см. В розділі Інструкція INSERT (Transact-SQL).

Вказуються умови пошуку, які використовуються для вказівки або . Додаткові відомості про аргументи цієї пропозиції см. В розділі Умова пошуку (Transact-SQL).

Повинно бути вказано принаймні одне з трьох пропозицій MATCHED, але вони можуть бути вказані в будь-якому порядку. В одному реченні MATCHED змінна не може бути оновлена ​​більше одного разу.

На всі операції видалення, вставки або поновлення, зазначені стосовно цільової таблиці інструкції MERGE, поширюються всі обмеження, визначені для цієї таблиці, включаючи всі каскадні обмеження посилальної цілісності. Якщо IGNORE_DUP_KEY має значення ON для всіх унікальних індексів в цільовій таблиці, то в інструкції MERGE цей параметр не враховується.

Щоб використовувати інструкцію MERGE, необхідна крапка з комою (;) як ознака кінця інструкції. Виникає помилка 10713, якщо інструкція MERGE виконується без ознаки кінця конструкції.

Якщо функція @@ ROWCOUNT (Transact-SQL) використовується після інструкції MERGE, вона повертає загальна кількість вставлених, оновлених і видалених рядків з клієнта.

Ключове слово MERGE повністю резервується, якщо рівень сумісності бази даних встановлено на 100. Інструкція MERGE доступна при рівні сумісності 90 і 100, однак це ключове слово в повному обсязі зарезервовано при рівні сумісності 90.

Реалізація тригера

Для кожної операції вставки, оновлення або видалення, зазначеної в інструкції MERGE, SQL Server запускає всі відповідні тригери AFTER, певні для цільової таблиці, але не гарантує певного порядку запуску тригерів. Тригери, які визначені для одного і того ж дії, реалізуються в порядку, зазначеному користувачем. Додаткову інформацію про створення порядку виконання тригерів см. В розділі Вказівка ​​першого і останнього тригерів.

Якщо в цільовій таблиці включений тригер INSTEAD OF для операцій вставки, оновлення або видалення, виконуваних інструкцією MERGE, то потрібно включити тригер INSTEAD OF для всіх операцій, зазначених в інструкції MERGE.

Якщо в таблиці target_table визначені тригери INSTEAD OF UPDATE або INSTEAD OF DELETE, то операції оновлення або видалення не виконуються. Замість цього запускаються тригери, а таблиці inserted і deleted заповнюються відповідним чином.

Якщо в таблиці target_table визначені тригери INSTEAD OF INSERT, то операції вставки не виконуються. Замість цього запускаються тригери, і таблиця inserted заповнюється відповідним чином.

Схожі статті