I have to implement slowly changing
Dimension (Type 2) using MERGE Statement. the following steps used to created
Step1: Tables creation for Source and
Destination
USE [SSISPractice]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[DimCodes_SRC](
[CodeId] [int]
IDENTITY(1,1) NOT NULL,
[CodeType] [varchar](24) NULL,
[IsActive] [bit] NULL,
[CodeTypedate] [datetime] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
SET IDENTITY_INSERT [dbo].[DimCodes_SRC] ON
GO
INSERT [dbo].[DimCodes_SRC] ([CodeId], [CodeType], [IsActive], [CodeTypedate]) VALUES
(1, N'Caseload', 1, CAST(0x0000A174012A4AE4 AS DateTime))
GO
INSERT [dbo].[DimCodes_SRC] ([CodeId], [CodeType], [IsActive], [CodeTypedate]) VALUES
(2, N'RelCase', 1, CAST(0x0000A174012A4AE4 AS DateTime))
GO
INSERT [dbo].[DimCodes_SRC] ([CodeId], [CodeType], [IsActive], [CodeTypedate]) VALUES
(3, N'RelPre', 1, CAST(0x0000A174012A4AE4 AS DateTime))
GO
SET IDENTITY_INSERT [dbo].[DimCodes_SRC] OFF
GO
/******
Object: Table [dbo].[DimCodes_SCD] Script Date: 3/6/2013 7:39:58 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[DimCodes_SCD](
[CodeId] [int]
IDENTITY(1,1) NOT NULL,
[CodeKey] [int] NOT NULL,
[CodeType] [varchar](24) NULL,
[IsActive] [bit] NULL,
[Startdate] [datetime] NULL,
[Enddate] [datetime] NULL,
[HashValue] AS (binary_checksum([codekey],[codetype]))
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/******
Object: Table [dbo].[DimCodes_SRC] Script Date: 3/6/2013 7:39:58 PM ******/
Step
2:
Create SQL code to implement the "Execute SQL Task"
Create SQL code to implement the "Execute SQL Task"
-------------- Update data
---------------
SET NOCOUNT ON;
MERGE dbo.DimCodes_SCD AS T1
USING (SELECT [CodeId]
,CASE WHEN([CodeType]='') THEN NULL ELSE [CodeType] END AS [CodeType]
, [CodeTypeDate]
,BINARY_CHECKSUM([CodeId]
,[CodeType]
)AS Hashvalue
FROM [dbo].[DimCodes_SRC] ) AS S1
ON S1.HashValue <> T1.HashValue
AND S1.[CodeId] = T1.[CodeKey]
WHEN MATCHED THEN
UPDATE SET T1.EndDate = GETDATE(), T1.IsActive = 'False';
-------------- Insert data ---------------
SET NOCOUNT ON;
MERGE dbo.DimCodes_SCD AS T1
USING (SELECT [CodeId]
,CASE WHEN([CodeType]='') THEN NULL ELSE [CodeType] END AS [CodeType]
,GETDATE() AS CodeTypeDate
,NULL AS EndDate
,1 AS ISActive
,BINARY_CHECKSUM([CodeId]
,[CodeType]
)AS Hashvalue
FROM [dbo].[DimCodes_SRC] ) AS S1
ON S1.HashValue = T1.HashValue
AND S1.[CodeId] = T1.[CodeKey]
AND S1.CodeType = T1.CodeType
WHEN NOT MATCHED THEN
INSERT ([CodeKey]
,[CodeType]
,StartDate
,EndDate
,IsActive
)
VALUES ([CodeId]
,[CodeType]
,CodeTypeDate
,EndDate
,IsActive);
SET NOCOUNT ON;
MERGE dbo.DimCodes_SCD AS T1
USING (SELECT [CodeId]
,CASE WHEN([CodeType]='') THEN NULL ELSE [CodeType] END AS [CodeType]
, [CodeTypeDate]
,BINARY_CHECKSUM([CodeId]
,[CodeType]
)AS Hashvalue
FROM [dbo].[DimCodes_SRC] ) AS S1
ON S1.HashValue <> T1.HashValue
AND S1.[CodeId] = T1.[CodeKey]
WHEN MATCHED THEN
UPDATE SET T1.EndDate = GETDATE(), T1.IsActive = 'False';
-------------- Insert data ---------------
SET NOCOUNT ON;
MERGE dbo.DimCodes_SCD AS T1
USING (SELECT [CodeId]
,CASE WHEN([CodeType]='') THEN NULL ELSE [CodeType] END AS [CodeType]
,GETDATE() AS CodeTypeDate
,NULL AS EndDate
,1 AS ISActive
,BINARY_CHECKSUM([CodeId]
,[CodeType]
)AS Hashvalue
FROM [dbo].[DimCodes_SRC] ) AS S1
ON S1.HashValue = T1.HashValue
AND S1.[CodeId] = T1.[CodeKey]
AND S1.CodeType = T1.CodeType
WHEN NOT MATCHED THEN
INSERT ([CodeKey]
,[CodeType]
,StartDate
,EndDate
,IsActive
)
VALUES ([CodeId]
,[CodeType]
,CodeTypeDate
,EndDate
,IsActive);