Step 1 - Create Target Table (tbl_Employee)
The code below will create the database, AdventureWorksEmployee, and create the target table tbl_Employee.CREATE DATABASE [ADVENTUREWORKSEMPLOYEE] GO USE [AdventureWorksEmployee] GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbl_Employee]') AND type in (N'U')) DROP TABLE [dbo].[tbl_Employee] GO USE [AdventureWorksEmployee] GO CREATE TABLE [dbo].[tbl_Employee]( [EmployeeID] [bigint] IDENTITY(1,1) NOT NULL, [FirstName] [varchar](128) NULL, [LastName] [varchar](128) NULL, [Location] [varchar](128) NULL, [Phone] [varchar](128) NULL, CONSTRAINT [PK_tbl_Employee] PRIMARY KEY CLUSTERED ( [EmployeeID] ASC )WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO
Step 2 - Create Source Table (tbl_Employee_Staging
The next code example will create the staging table for our updated, new, and removed employees. In a real-world example this may be from a nightly extract of your HR data into this table.USE [AdventureWorksEmployee] GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbl_Employee_Staging]') AND type in (N'U')) DROP TABLE [dbo].[tbl_Employee_Staging] GO USE [AdventureWorksEmployee] GO CREATE TABLE [dbo].[tbl_Employee_Staging]( [FirstName] [varchar](128) NULL, [LastName] [varchar](128) NULL, [Location] [varchar](128) NULL, [Phone] [varchar](128) NULL ) ON [PRIMARY] GO
Step 3 - Insert Data into the Source and Target Table (tbl_Employee) & (tbl_Employee_Staging)
Next, we will enter some sample data into our tbl_Employee table and tbl_Employee_Staging table. The data in our tbl_Employee table is our existing data and the data in our tbl_Employee_Staging table is the data we want to add insert and delete. The row we want to insert into our tbl_Employee table is "Thomas","Liddle","DE","555-999-1234".
USE [AdventureWorksEmployee]
GO
TRUNCATE TABLE [dbo].[tbl_Employee]
GO
TRUNCATE TABLE [dbo].[tbl_Employee_Staging]
GO
INSERT INTO [AdventureWorksEmployee].[dbo].[tbl_Employee]
([FirstName]
,[LastName]
,[Location]
,[Phone])
VALUES
('John',
'Doe',
'RI',
'555-123-4567')
GO
INSERT INTO [AdventureWorksEmployee].[dbo].[tbl_Employee]
([FirstName]
,[LastName]
,[Location]
,[Phone])
VALUES
('Jane',
'Doe',
'WA',
'555-444-7890')
GO
/*
THIS IS OUR NEW ROW
*/
INSERT INTO [AdventureWorksEmployee].[dbo].[tbl_Employee_Staging]
([FirstName]
,[LastName]
,[Location]
,[Phone])
VALUES
('Thomas'
,'Liddle'
,'DE'
,'555-999-1234')
/*
END
*/
GO
INSERT INTO [AdventureWorksEmployee].[dbo].[tbl_Employee_Staging]
([FirstName]
,[LastName]
,[Location]
,[Phone])
VALUES
('John',
'Doe',
'RI',
'555-123-4567')
GO
INSERT INTO [AdventureWorksEmployee].[dbo].[tbl_Employee_Staging]
([FirstName]
,[LastName]
,[Location]
,[Phone])
VALUES
('Jane',
'Doe',
'WA',
'555-444-7890')
GO
Step 4 - Run the MERGE statement and insert data in tbl_Employee_Stage to tbl_Employee
The MERGE statement below will look for differences in the tbl_Employee table and the tbl_Employee_Staging table using the FirstName and LastName as a key. The #tbl_EmployeeChanges table allows you to view or audit the changes performed with the MERGE statement. This is possable with the OUTPUT statement.
USE AdventureWorksEmployee
GO
SELECT 'tbl_Employee_BEFORE',* FROM tbl_Employee
GO
CREATE TABLE #tbl_EmployeeChanges
(
[FirstNameDeleted] varchar(128)
,[LastNameDeleted] varchar(128)
,[LocationDeleted] varchar(128)
,[PhoneDeleted] varchar(128)
,[Action] varchar(128)
,[FirstNameInserted] varchar(128)
,[LastNameInserted] varchar(128)
,[LocationInserted] varchar(128)
,[PhoneInserted] varchar(128)
)
MERGE dbo.tbl_Employee AS target
USING
(SELECT [FirstName],[LastName],[Location],[Phone] FROM dbo.tbl_Employee_Staging) AS source
([FirstName],[LastName],[Location],[Phone])
ON (
target.[FirstName] = source.[FirstName]
AND target.[LastName] = source.[LastName])
WHEN MATCHED THEN
UPDATE
SET
[FirstName] = source.[FirstName]
,[LastName] = source.[LastName]
,[Location] = source.[Location]
,[Phone] = source.[Phone]
WHEN NOT MATCHED THEN
INSERT ([FirstName],[LastName],[Location],[Phone])
VALUES (source.[FirstName]
,source.[LastName]
,source.[Location]
,source.[Phone])
WHEN NOT MATCHED BY SOURCE THEN
DELETE
OUTPUT
deleted.[FirstName]
,deleted.[LastName]
,deleted.[Location]
,deleted.[Phone]
,$action
,inserted.[FirstName]
,inserted.[LastName]
,inserted.[Location]
,inserted.[Phone]
INTO #tbl_EmployeeChanges;
GO
SELECT * FROM #tbl_EmployeeChanges
GO
drop table #tbl_EmployeeChanges
GO
SELECT 'tbl_Employee_AFTER',* FROM tbl_Employee