0% found this document useful (0 votes)
19 views

Merge

The MERGE statement allows inserting, updating, and deleting records within a single statement by specifying a source dataset and target table along with a join condition. It matches records between the source and target, then performs the specified data modification action for matched and unmatched records. This makes it useful for loading large data warehouse tables with specific actions for present and absent rows. The example demonstrates using MERGE to synchronize a target products table with updated data from a source table, performing two rate updates, one deletion, and one insertion.

Uploaded by

Pankaj Sethi
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
19 views

Merge

The MERGE statement allows inserting, updating, and deleting records within a single statement by specifying a source dataset and target table along with a join condition. It matches records between the source and target, then performs the specified data modification action for matched and unmatched records. This makes it useful for loading large data warehouse tables with specific actions for present and absent rows. The example demonstrates using MERGE to synchronize a target products table with updated data from a source table, performing two rate updates, one deletion, and one insertion.

Uploaded by

Pankaj Sethi
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 3

The MERGE statement basically works as separate insert, update, and delete statements

all within the same statement. You specify a "Source" record set and a "Target" table,
and the join between the two. You then specify the type of data modification that is to
occur when the records between the two data are matched or are not matched. MERGE
is very useful, especially when it comes to loading data warehouse tables, which can be
very large and require specific actions to be taken when rows are or are not present.

Putting it all together

In this example I will take a Products table as target table and UpdatedProducts as a
source table containing updated list of products. I will then use the MERGE SQL
command to synchronize the target table with the source table.

 First Let's create a target table and a source table and populate some data to
these tables.

MERGE SQL statement - Part 1


--Create a target table
CREATE TABLE Products
(
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100),
Rate MONEY
)
GO
--Insert records into target table
INSERT INTO Products
VALUES
(1, 'Tea', 10.00),
(2, 'Coffee', 20.00),
(3, 'Muffin', 30.00),
(4, 'Biscuit', 40.00)
GO
--Create source table
CREATE TABLE UpdatedProducts
(
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100),
Rate MONEY
)
GO
--Insert records into source table
INSERT INTO UpdatedProducts
VALUES
(1, 'Tea', 10.00),
(2, 'Coffee', 25.00),
(3, 'Muffin', 35.00),
(5, 'Pizza', 60.00)
GO
SELECT * FROM Products
SELECT * FROM UpdatedProducts
GO

 Next I will use the MERGE SQL command to synchronize the target table with the
refreshed data coming from the source table.

MERGE SQL statement - Part 2


--Synchronize the target table with
--refreshed data from source table
MERGE Products AS TARGET
USING UpdatedProducts AS SOURCE
ON (TARGET.ProductID = SOURCE.ProductID)
--When records are matched, update
--the records if there is any change
WHEN MATCHED AND TARGET.ProductName <> SOURCE.ProductName
OR TARGET.Rate <> SOURCE.Rate THEN
UPDATE SET TARGET.ProductName = SOURCE.ProductName,
TARGET.Rate = SOURCE.Rate
--When no records are matched, insert
--the incoming records from source
--table to target table
WHEN NOT MATCHED BY TARGET THEN
INSERT (ProductID, ProductName, Rate)
VALUES (SOURCE.ProductID, SOURCE.ProductName, SOURCE.Rate)
--When there is a row that exists in target table and
--same record does not exist in source table
--then delete this record from target table
WHEN NOT MATCHED BY SOURCE THEN
DELETE
--$action specifies a column of type nvarchar(10)
--in the OUTPUT clause that returns one of three
--values for each row: 'INSERT', 'UPDATE', or 'DELETE',
--according to the action that was performed on that row
OUTPUT $action,
DELETED.ProductID AS TargetProductID,
DELETED.ProductName AS TargetProductName,
DELETED.Rate AS TargetRate,
INSERTED.ProductID AS SourceProductID,
INSERTED.ProductName AS SourceProductName,
INSERTED.Rate AS SourceRate;
SELECT @@ROWCOUNT;
GO

When the above is run this is the output.  There were 2 updates, 1 delete and 1 insert.

If we select all records from the Products table we can see the final results.  We can see
the Coffee rate was updated from 20.00 to 25.00, the Muffin rate was updated from
30.00 to 35.00, Biscuit was deleted and Pizza was inserted.
Notes

 The MERGE SQL statement requires a semicolon (;) as a statement terminator.


Otherwise Error 10713 is raised when a MERGE statement is executed without the
statement terminator.
 When used after MERGE, @@ROWCOUNT returns the total number of rows
inserted, updated, and deleted to the client.
 At least one of the three MATCHED clauses must be specified when using MERGE
statement; the MATCHED clauses can be specified in any order. However a
variable cannot be updated more than once in the same MATCHED clause.
 Of course it’s obvious, but just to mention, the person executing the MERGE
statement should have SELECT Permission on the SOURCE Table and INSERT,
UPDATE and DELETE Permission on the TARGET Table.
 MERGE SQL statement improves the performance as all the data is read and
processed only once whereas in previous versions three different statements have
to be written to process three different activities (INSERT, UPDATE or DELETE) in
which case the data in both the source and target tables are evaluated and
processed multiple times; at least once for each statement.
 MERGE SQL statement takes same kind of locks minus one Intent Shared (IS)
Lock that was due to the select statement in the ‘IF EXISTS’ as we did in previous
version of SQL Server.
 For every insert, update, or delete action specified in the MERGE statement, SQL
Server fires any corresponding AFTER triggers defined on the target table, but
does not guarantee on which action to fire triggers first or last. Triggers defined
for the same action honor the order you specify.

You might also like