I am trying to build a Slow Changing Dimension Table with T-SQL since I notice I can not used the SCD in SSIS because I have a large data.
I need your help
My table structure:
CREATE TABLE [dbo].[Customer]
(
[BusinessEntityID] [int] PRIMARY KEY NOT NULL,
[FirstName] [nvarchar](50) NULL,
[MiddleName] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NULL,
[EmailAddress] [nvarchar](50) NULL,
[AddressLine1] [nvarchar](60) NULL,
[AddressLine2] [nvarchar](60) NULL,
[City] [nvarchar](30) NULL,
[PostalCode] [nvarchar](15) NULL,
[CountryRegionCode] [nvarchar](3) NULL,
[Country] [nvarchar](50) NULL,
[StateProvince] [nvarchar](50) NULL
)
CREATE TABLE [dbo].[DimCustomer]
(
[CustomerKey] int IDENTITY (1,1) PRIMARY KEY CLUSTERED,
[BusinessEntityID] int NOT NULL,
[FirstName] nvarchar(50) NULL,
[MiddleName] nvarchar(50) NULL,
[LastName] nvarchar(50) NULL,
[EmailAddress] nvarchar(50) NULL,
[AddressLine1] nvarchar(60) NULL,
[AddressLine2] nvarchar(60) NULL,
[City] nvarchar(30) NULL,
[PostalCode] nvarchar(15) NULL,
[CountryRegionCode] nvarchar(3) NULL,
[Country] nvarchar(50) NULL,
[StateProvince] nvarchar(50) NULL,
[StartDate] Datetime NULL,
[EndDate] Datetime NULL,
[CurrentFlag] Char(1)
)
Merge statement:
MERGE INTO dbo.DimCustomer Dest
USING dbo.Customer Src ON (Dest.BusinessEntityID = Src.BusinessEntityID)
WHEN MATCHED AND Dest.FirstName != Src.FirstName
THEN
UPDATE SET Dest.FirstName = Src.FirstName;
USE BART_DEV
GO
MERGE INTO dbo.DimCustomer Dest
USING dbo.Customer Src ON (Dest.BusinessEntityID = Src.BusinessEntityID)
WHEN MATCHED AND Dest.MiddleName != Src.MiddleName
THEN
UPDATE SET Dest.MiddleName = Src.MiddleName;
USE BART_DEV
GO
MERGE INTO dbo.DimCustomer Dest
USING dbo.Customer Src ON (Dest.BusinessEntityID = Src.BusinessEntityID)
WHEN MATCHED AND Dest.LastName != Src.LastName
THEN
UPDATE SET Dest.LastName = Src.LastName;
So far the above statement is working correctly however the bottom statement does not work.
USE BOB_DEV
GO
INSERT INTO dbo.DimCustomer ([BusinessEntityID],[FirstName],[MiddleName], [LastName],[AddressLine1], [AddressLine2], [City], [PostalCode], [CountryRegionCode], [Country], [StateProvince], [StartDate], [EndDate], [CurrentFlag])
SELECT
[BusinessEntityID], [FirstName], [MiddleName], [LastName],
[AddressLine1], [AddressLine2], [City], [PostalCode], [CountryRegionCode],
[Country], [StateProvince], [StartDate], [EndDate], [CurrentFlag]
FROM
(MERGE dbo.DimCustomer TT
USING dbo.Customer ST ON (TT.BusinessEntityID = ST.BusinessEntityID)
WHEN NOT MATCHED THEN
INSERT ([BusinessEntityID], [FirstName], [MiddleName], [LastName],
[AddressLine1], [AddressLine2], [City], [PostalCode],
[CountryRegionCode], [Country], [StateProvince],
[StartDate], [EndDate], [CurrentFlag])
VALUES ([BusinessEntityID], [FirstName], [MiddleName], [LastName],
[AddressLine1], [AddressLine2], [City], [PostalCode],
[CountryRegionCode], [Country], [StateProvince],
'01/01/1900', NULL, '0')
WHEN NOT MATCHED AND TT.CurrentFlag = 'Y' AND (ISNULL(TT.AddressLine1, '') != ISNULL (ST.AddressLine1,''))
THEN
UPDATE SET TT.CurrentFlag = 'N', TT.EndDate = GETDATE() -1
WHEN NOT MATCHED AND TT.CurrentFlag = 'Y' AND (ISNULL(TT.AddressLine2, '') != ISNULL (ST.AddressLine2,''))
THEN
UPDATE SET TT.CurrentFlag = 'N', TT.EndDate = GETDATE() -1
WHEN NOT MATCHED AND TT.CurrentFlag = 'Y' AND (ISNULL(TT.City, '') != ISNULL (ST.City,''))
THEN
UPDATE SET TT.CurrentFlag = 'N', TT.EndDate = GETDATE() -1
WHEN NOT MATCHED AND TT.CurrentFlag = 'Y' AND (ISNULL(TT.PostalCode, '') != ISNULL (ST.PostalCode,''))
THEN
UPDATE SET TT.CurrentFlag = 'N', TT.EndDate = GETDATE() -1
WHEN NOT MATCHED AND TT.CurrentFlag = 'Y' AND (ISNULL(TT.CountryRegionCode, '') != ISNULL (ST.CountryRegionCode,''))
THEN
UPDATE SET TT.CurrentFlag = 'N', TT.EndDate = GETDATE() -1
WHEN NOT MATCHED AND TT.CurrentFlag = 'Y' AND (ISNULL(TT.Country, '') != ISNULL (ST.Country,''))
THEN
UPDATE SET TT.CurrentFlag = 'N', TT.EndDate = GETDATE() -1
WHEN NOT MATCHED AND TT.CurrentFlag = 'Y' AND (ISNULL(TT.StateProvince, '') != ISNULL (ST.StateProvince,''))
THEN
UPDATE SET TT.CurrentFlag = 'N', TT.EndDate = GETDATE() -1
OUTPUT $Action Action_Taken, ST.BusinessEntityID, ST.FirstName, ST.MiddleName, ST.LastName, ST.AddressLine1, ST.AddressLine2, ST.City, ST.PostalCode, ST.CountryRegionCode, ST.Country, ST.StateProvince, GETDATE() AS EndDate, NULL AS EndDate, 'Y' AS CurrentFlag
)
AS MERGE_OUT
WHERE MERGE_OUT.Action_Taken = 'UPDATE';
GO
SELECT * FROM dbo.DimCustomer
However, I am getting this error message :
Msg 10710, Level 15, State 1, Line 15
An action of type 'UPDATE' is not allowed in the 'WHEN NOT MATCHED' clause of a MERGE statement.
I don't know how to solve this error message.