В типичном хранилище данных Microsoft SQL Server обычно выполняются операции INSERT, UPDATE и DELETE в целевой таблице путем сопоставления записей из исходной таблицы. Этот процесс может стать громоздким и затратным по времени при использовании отдельных команд DML. Однако, начиная с SQL Server 2008, разработчики могут использовать команду MERGE для оптимизации этих операций в одном операторе.
Команда MERGE, аналогичная команде UPSERT в Oracle, позволяет вставлять строки, которых нет, и обновлять строки, которые уже существуют в целевой таблице. Она объединяет последовательность условных команд INSERT, UPDATE и DELETE в один атомарный оператор, улучшая производительность и упрощая код.
Вот синтаксис оператора MERGE:
MERGE <целевая_таблица> [AS TARGET] USING <источник_таблицы> [AS SOURCE] ON <условие_поиска> [WHEN MATCHED THEN <merge_matched> ] [WHEN NOT MATCHED [BY TARGET] THEN <merge_not_matched> ] [WHEN NOT MATCHED BY SOURCE THEN <merge_matched> ];
Оператор MERGE работает как отдельные операторы INSERT, UPDATE и DELETE в рамках одного оператора. Вы указываете набор записей “Источник” и таблицу “Цель”, и определяете условие JOIN между ними. Затем вы указываете тип модификации данных, которая должна произойти, когда записи между двумя наборами данных совпадают или не совпадают.
Вот пример использования команды MERGE для синхронизации целевой таблицы с обновленным списком продуктов:
-- Создание целевой таблицы CREATE TABLE Products ( ProductID INT PRIMARY KEY, ProductName VARCHAR(100), Rate MONEY ) -- Вставка записей в целевую таблицу INSERT INTO Products VALUES (1, 'Чай', 10.00), (2, 'Кофе', 20.00), (3, 'Маффин', 30.00), (4, 'Печенье', 40.00) -- Создание исходной таблицы CREATE TABLE UpdatedProducts ( ProductID INT PRIMARY KEY, ProductName VARCHAR(100), Rate MONEY ) -- Вставка записей в исходную таблицу INSERT INTO UpdatedProducts VALUES (1, 'Чай', 10.00), (2, 'Кофе', 25.00), (3, 'Маффин', 35.00), (5, 'Пицца', 60.00) -- Синхронизация целевой таблицы с обновленными данными из исходной таблицы MERGE Products AS TARGET USING UpdatedProducts AS SOURCE ON (TARGET.ProductID = SOURCE.ProductID) WHEN MATCHED AND TARGET.ProductName <> SOURCE.ProductName OR TARGET.Rate <> SOURCE.Rate THEN UPDATE SET TARGET.ProductName = SOURCE.ProductName, TARGET.Rate = SOURCE.Rate WHEN NOT MATCHED BY TARGET THEN INSERT (ProductID, ProductName, Rate) VALUES (SOURCE.ProductID, SOURCE.ProductName, SOURCE.Rate) WHEN NOT MATCHED BY SOURCE THEN DELETE SELECT * FROM Products
После выполнения приведенного выше кода целевая таблица (Products) будет синхронизирована с обновленными данными из исходной таблицы (UpdatedProducts). Оператор MERGE будет обновлять существующие записи, вставлять новые записи и удалять записи, которых больше нет в исходной таблице.
Оператор MERGE предлагает несколько ключевых преимуществ:
- Улучшенная производительность: оператор MERGE читает и обрабатывает данные только один раз, в отличие от отдельных операторов INSERT, UPDATE и DELETE, которые оценивают и обрабатывают данные несколько раз.
- Упрощенный код: оператор MERGE объединяет несколько операций с данными в один оператор, уменьшая сложность и улучшая поддерживаемость кода.
- Атомарность: оператор MERGE гарантирует, что все модификации данных выполняются как одна атомарная операция, предотвращая несогласованности в данных.
Используя команду MERGE в SQL Server, разработчики могут оптимизировать свои операции с данными и улучшить эффективность своих SQL-скриптов и хранимых процедур.