As I was catching up on SQL 2008 this morning, I spent some time working with the T-SQL MERGE command, new in SQL 2008. Most of the blogs and examples online are a bit terse, so I decided to write a simple sample.
Check it out:
--// Create our SOURCE table
DECLARE @t1 TABLE (
id int,
name nvarchar(16),
email nvarchar(32)
)
--// Create our TARGET table
DECLARE @t2 TABLE (
id int,
name nvarchar(16),
email nvarchar(32)
)
--// Insert values into SOURCE table
INSERT INTO @t1 VALUES (1, 'Charles Chen', 'charles.chen@domain.com')
INSERT INTO @t1 VALUES (2, 'Sandra Chen', 'sandra.chen@domain.com')
INSERT INTO @t1 VALUES (3, 'Brad Wright', 'brad.wright@domain.com')
--// Insert values into TARGET table
INSERT INTO @t2 VALUES (4, 'Brady Sines', 'brady.sines@domain.com')
INSERT INTO @t2 VALUES (1, '', '')
--// Select values from the TARGET table (just to verify)
SELECT * FROM @t2
--// Merge records from source to target
MERGE
@t2 AS [target]
USING
@t1 AS [source]
ON
([target].id = [source].id)
WHEN NOT MATCHED BY TARGET
THEN
INSERT(id, name, email)
VALUES([source].id, [source].name, [source].email)
WHEN MATCHED
THEN
UPDATE SET
[target].name = [source].name,
[target].email = [source].email
--// Get the journal of actions
OUTPUT $action, inserted.*, deleted.*;
--// Grab the resultant table
SELECT * FROM @t2
And here are the results:

Awesome! Admittedly, I'm still trying to come up with some legitimate uses for this in my day-to-day application programming 