/****** Object: StoredProcedure [dbo].[TransformManagedEntityResultFactProc] Script Date: 06/18/2010 03:49:52 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TransformManagedEntityResultFactProc]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[TransformManagedEntityResultFactProc]
GO
/****** Object: StoredProcedure [dbo].[TransformManagedEntityResultFactProc] Script Date: 06/18/2010 03:49:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TransformManagedEntityResultFactProc] (@WaterMark xml)
AS
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
-- Get Metadata
DECLARE @BatchId int, @Inserted int, @Updated int, @MaxActivityTimestamp datetime, @ActivityTimestamp datetime, @MinDateKey int
SET @Inserted = 0
SET @Updated = 0
BEGIN TRY
SELECT * INTO #wm FROM etl.ShredWaterMark(@WaterMark)
SELECT TOP 1 @ActivityTimestamp = WaterMark, @BatchId = BatchId
FROM #wm
WHERE WarehouseEntityName = N'MTV_System$Compliance$ManagedEntityResult'
--SELECT @MaxActivityTimestamp = COALESCE(MAX(DWTimestamp), GETUTCDATE())
-- FROM inbound.MTV_System$Compliance$ManagedEntityResult
SELECT @MaxActivityTimestamp = GETUTCDATE()
--Start: Region Temp tables
IF OBJECT_ID('TEMPDB..#MERTemp') IS NOT NULL
DROP TABLE #MERTemp;
Select T1.[System.Compliance.ManagedEntityResult!Details],
T1.LastModified,
T1.[System.Compliance.ManagedEntityResult!LastScannedTime],
T1.DatasourceId,
T1.BaseManagedEntityId,
T1.TimeAdded,
T1.[System.Compliance.ManagedEntityResult!Result],
T1.[System.Compliance.ManagedEntityResult!ResultType],
T1.[System.Compliance.ManagedEntityResult!SourceTestID],
T1.DWTimestamp,
T1.[System.Compliance.ManagedEntityResult]
INTO #MERTemp
from inbound.MTV_System$Compliance$ManagedEntityResult T1
WHERE T1.DWTimestamp >= @ActivityTimestamp AND T1.DWTimestamp < @MaxActivityTimestamp
create NONCLUSTERED INDEX [MERTemp_ind]
on #MERTemp ([System.Compliance.ManagedEntityResult!SourceTestID])
IF OBJECT_ID('TEMPDB..#CATemp') IS NOT NULL
DROP TABLE #CATemp;
Select CADim.ControlActivityDimKey,
CADim.TestId,
CADim.IsDeleted
INTO #CATemp
from dbo.ControlActivityDimvw CADim
WHERE CADim.TestId <> ''
AND IsDeleted=0
create NONCLUSTERED INDEX [CATemp_ind]
on #CATemp (TestId)
IF OBJECT_ID('TEMPDB..#MERRelatesCI') IS NOT NULL
DROP TABLE #MERRelatesCI;
Select SourceEntityId,TargetEntityId
INTO #MERRelatesCI
from inbound.MTV_System$Compliance$ManagedEntityResultRelatesToConfigItem
CREATE NONCLUSTERED INDEX [MERRelatesCI_Ind]
ON #MERRelatesCI ([SourceEntityId])
IF OBJECT_ID('TEMPDB..#CITemp') IS NOT NULL
DROP TABLE #CITemp;
Select CI.BaseManagedEntityId AS BaseManagedEntityId,
CI.ConfigItemDimKey AS ConfigItemDimKey,
CI.IsDeleted AS IsDeleted
INTO #CITemp
from dbo.ConfigItemDimvw CI
where CI.IsDeleted =0
CREATE NONCLUSTERED INDEX [CITemp_Ind]
ON #CITemp ([BaseManagedEntityId])
IF OBJECT_ID('TEMPDB..#MERRelatesSS') IS NOT NULL
DROP TABLE #MERRelatesSS;
Select SourceEntityId,TargetEntityId
INTO #MERRelatesSS
from inbound.MTV_System$Compliance$ManagedEntityResultRelatesToSourceSystem
CREATE NONCLUSTERED INDEX [MERRelatesSS_Ind]
ON #MERRelatesSS ([SourceEntityId])
--End: Region Temp tables
IF OBJECT_ID('tempdb..#Temp1') IS NOT NULL
BEGIN
DROP TABLE #Temp1
END
--Get the both Manual and Automated into Temp1
INSERT INTO #Temp1 (
[ControlActivityDimKey],
[ConfigItemDimKey],
[MERResultId],
[MERResultTypeId],
[MERSourceDimKey],
[Details],
[DateKey],
[LastScannedTime],
--[ManagedEntityResultDimKey],
[DatasourceId],
[BaseManagedEntityId],
[TimeAdded]
)
--SELECT DISTINCT Act_DimCA.ControlActivityDimKey,
-- Act_DimCI.ConfigItemDimKey,
-- COALESCE(MERResultId, 0) AS MERResultId,
-- COALESCE(MERResultTypeId, 0) AS MERResultTypeId,
-- ACT_Source.MERSourceDimKey AS MERSourceDimKey,
-- [System.Compliance.ManagedEntityResult!Details] AS Details,
-- CONVERT(nvarchar(8), INB.LastModified , 112) AS DateKey,
-- [System.Compliance.ManagedEntityResult!LastScannedTime] AS LastScannedTime,
-- --ACT_DimMER.ManagedEntityResultDimKey AS ManagedEntityResultDimKey,
-- INB.DatasourceId,
-- INB.BaseManagedEntityId
--FROM inbound.MTV_System$Compliance$ManagedEntityResult INB
-- JOIN dbo.MERResultvw Act_Result
-- ON Act_Result.EnumTypeId = INB.[System.Compliance.ManagedEntityResult!Result]
-- JOIN dbo.MERResultTypevw Act_ResultType
-- ON Act_ResultType.EnumTypeId = INB.[System.Compliance.ManagedEntityResult!ResultType]
-- LEFT JOIN inbound.MTV_System$Compliance$ControlActivityContainsManagedEntityResult Act_DimCAMER
-- ON Act_DimCAMER.TargetEntityId = INB.BaseManagedEntityId
-- LEFT JOIN dbo.ControlActivityDimvw Act_DimCA
-- ON Act_DimCA.BaseManagedEntityId = Act_DimCAMER.SourceEntityId
-- AND Act_DimCA.IsDeleted = 0
-- LEFT JOIN inbound.MTV_System$Compliance$ManagedEntityResultRelatesToConfigItem Act_DimMERCI
-- ON Act_DimMERCI.SourceEntityId = INB.BaseManagedEntityId
-- LEFT JOIN dbo.ConfigItemDimvw Act_DimCI
-- ON Act_DimCI.BaseManagedEntityId = Act_DimMERCI.TargetEntityId
-- AND Act_DimCI.IsDeleted = 0
-- LEFT JOIN inbound.MTV_System$Compliance$ManagedEntityResultRelatesToSourceSystem Act_DimMERSourceSystem
-- ON Act_DimMERSourceSystem.SourceEntityId = INB.BaseManagedEntityId
-- LEFT JOIN dbo.MERSourceDimvw ACT_Source
-- ON ACT_Source.BaseManagedEntityId = Act_DimMERSourceSystem.TargetEntityId
-- WHERE INB.DWTimestamp >= @ActivityTimestamp AND INB.DWTimestamp < @MaxActivityTimestamp
--UNION
SELECT DISTINCT Act_DimCA.ControlActivityDimKey,
Act_DimCI.ConfigItemDimKey,
COALESCE(MERResultId, 0) AS MERResultId,
COALESCE(MERResultTypeId, 0) AS MERResultTypeId,
ACT_Source.MERSourceDimKey AS MERSourceDimKey,
[System.Compliance.ManagedEntityResult!Details] AS Details,
CONVERT(nvarchar(8), INB.LastModified , 112) AS DateKey,
[System.Compliance.ManagedEntityResult!LastScannedTime] AS LastScannedTime,
--ACT_DimMER.ManagedEntityResultDimKey AS ManagedEntityResultDimKey,
INB.DatasourceId,
INB.BaseManagedEntityId,
CONVERT(VARCHAR(8), INB.TimeAdded, 112) AS TimeAdded
FROM #MERTemp INB with (nolock)
JOIN dbo.MERResultvw Act_Result with(nolock)
ON Act_Result.EnumTypeId = INB.[System.Compliance.ManagedEntityResult!Result]
JOIN dbo.MERResultTypevw Act_ResultType with(nolock)
ON Act_ResultType.EnumTypeId = INB.[System.Compliance.ManagedEntityResult!ResultType]
LEFT JOIN #CATemp Act_DimCA with(nolock)
ON (Act_DimCA.TestId LIKE INB.[System.Compliance.ManagedEntityResult!SourceTestID] +'%'
OR INB.[System.Compliance.ManagedEntityResult!SourceTestID] LIKE Act_DimCA.TestId +'%')
--AND Act_DimCA.IsDeleted = 0
LEFT JOIN #MERRelatesCI Act_DimMERCI with(nolock)
ON Act_DimMERCI.SourceEntityId = INB.BaseManagedEntityId
LEFT JOIN #CITemp Act_DimCI with(nolock)
ON Act_DimCI.BaseManagedEntityId = Act_DimMERCI.TargetEntityId
--AND Act_DimCI.IsDeleted = 0
LEFT JOIN #MERRelatesSS Act_DimMERSourceSystem with(nolock)
ON Act_DimMERSourceSystem.SourceEntityId = INB.BaseManagedEntityId
LEFT JOIN dbo.MERSourceDimvw ACT_Source with(nolock)
ON ACT_Source.BaseManagedEntityId = Act_DimMERSourceSystem.TargetEntityId
WHERE INB.DWTimestamp >= @ActivityTimestamp AND INB.DWTimestamp < @MaxActivityTimestamp
AND Act_DimCA.TestId <> ''
--gkapila: There won't be any duplicates rows as we are not taking a union anymore in above query
--Whenever new MER comes, if it is manual then NULL CA will come in the automated and vice versa
--So we have to delete the ones that is duplicate
--DELETE a
--FROM #Temp1 a
--JOIN #Temp1 bb ON
-- a.BaseManagedEntityId = bb.BaseManagedEntityId
-- and a.DatasourceId = bb.DatasourceId
-- and a.ControlActivityDimKey IS NULL
-- and bb.ControlActivityDimKey IS NOT NULL
--gkapila: There won't be any updates as we are not having manual MER's in V1
----Get both Manual / Automated data in to #temp2. Join with MER FACT to check for update
--SELECT DISTINCT ISNULL(INB.ControlActivityDimKey, MER.ControlActivityDimKey) AS ControlActivityDimKey,
--ISNULL(INB.ConfigItemDimKey, MER.ConfigItemDimKey) AS ConfigItemDimKey,
--INB.MERResultId AS MERResultId,
--INB.MERResultTypeId AS MERResultTypeId,
--ISNULL(INB.MERSourceDimKey, MER.MERSourceDimKey) AS MERSourceDimKey,
--INB.Details AS Details,
--INB.DateKey AS DateKey,
--INB.LastScannedTime AS LastScannedTime,
--INB.ManagedEntityResultDimKey AS ManagedEntityResultDimKey,
--INB.DatasourceId,
--INB.BaseManagedEntityId
--INTO #Temp2
--FROM #Temp1 INB
--LEFT JOIN ManagedEntityResultFactvw MER
--ON INB.ManagedEntityResultDimKey = MER.ManagedEntityResultDimKey
---- If there are any early arrivals: When a Control Activity Dimkey / Config Item Dimkey / MER Source DimKey is null
---- We should pick the MER in the next run.
UPDATE INB SET
DWTimestamp = @MaxActivityTimestamp,
RejectedCount = ISNULL(INB.RejectedCount, 0) + 1,
BatchId = @BatchId
FROM inbound.MTV_System$Compliance$ManagedEntityResult INB
LEFT JOIN #Temp1 ACT_DimMER ON
ACT_DimMER.BaseManagedEntityId = INB.BaseManagedEntityId
AND ACT_DimMER.DatasourceId = INB.DatasourceId
WHERE (ACT_DimMER.ControlActivityDimKey IS NULL OR
ACT_DimMER.ConfigItemDimKey IS NULL OR
ACT_DimMER.MERSourceDimKey IS NULL) AND
INB.DWTimestamp >= @ActivityTimestamp AND
INB.DWTimestamp < @MaxActivityTimestamp
---- If there are any early arrivals: When a Control Activity Dimkey / Config Item Dimkey / MER Source DimKey is null
---- We should pick the MER to MER Source in the Next run
UPDATE INB SET
DWTimestamp = @MaxActivityTimestamp,
RejectedCount = ISNULL(INB.RejectedCount, 0) + 1,
BatchId = @BatchId
FROM inbound.MTV_System$Compliance$ManagedEntityResultRelatesToSourceSystem INB
LEFT JOIN inbound.Relationship REL ON
REL.RelationshipId = INB.RelationshipId
LEFT JOIN #Temp1 ACT_DimMER ON
ACT_DimMER.BaseManagedEntityId = REL.TargetEntityId
AND ACT_DimMER.DatasourceId = INB.DatasourceId
WHERE (ACT_DimMER.ControlActivityDimKey IS NULL OR
ACT_DimMER.ConfigItemDimKey IS NULL OR
ACT_DimMER.MERSourceDimKey IS NULL) AND
INB.DWTimestamp >= @ActivityTimestamp AND
INB.DWTimestamp < @MaxActivityTimestamp
---- If there are any early arrivals: When a Control Activity Dimkey / Config Item Dimkey / MER Source DimKey is null
---- We should pick the MER to Config Item in the Next run
UPDATE INB SET
DWTimestamp = @MaxActivityTimestamp,
RejectedCount = ISNULL(INB.RejectedCount, 0) + 1,
BatchId = @BatchId
FROM inbound.MTV_System$Compliance$ManagedEntityResultRelatesToConfigItem INB
LEFT JOIN inbound.Relationship REL ON
REL.RelationshipId = INB.RelationshipId
LEFT JOIN #Temp1 ACT_DimMER ON
ACT_DimMER.BaseManagedEntityId = REL.TargetEntityId
AND ACT_DimMER.DatasourceId = INB.DatasourceId
WHERE (ACT_DimMER.ControlActivityDimKey IS NULL OR
ACT_DimMER.ConfigItemDimKey IS NULL OR
ACT_DimMER.MERSourceDimKey IS NULL) AND
INB.DWTimestamp >= @ActivityTimestamp AND
INB.DWTimestamp < @MaxActivityTimestamp
DELETE FROM #Temp1
WHERE
(
ControlActivityDimKey IS NULL OR
ConfigItemDimKey IS NULL OR
MERSourceDimKey IS NULL
)
SELECT @MinDateKey = MIN(TimeAdded) FROM #Temp1
--Prevent Dup Key problems
DELETE a From #Temp1 a
JOIN ManagedEntityResultFactvw b
ON a.BaseManagedEntityId = b.BaseManagedEntityId
AND a.DatasourceId = b.SourceId
AND a.ConfigItemDimKey = b.ConfigItemDimKey
AND a.ControlActivityDimKey = b.ControlActivityDimKey
AND a.LastScannedTime = b.LastScannedTime
WHERE b.DateKey >= @MinDateKey
UPDATE #wm SET WaterMark = CONVERT(nvarchar(64), ISNULL(@MaxActivityTimestamp,'1/1/1900'),109)
WHERE WarehouseEntityName = N'MTV_System$Compliance$ManagedEntityResult' and WaterMarkType= N'DateTime'
SELECT @WaterMark = (SELECT ModuleName AS "@ModuleName",
ProcessName AS "@ProcessName",
@BatchId AS "@BatchId",
(SELECT DISTINCT WarehouseEntityName AS "@WarehouseEntityName",
WarehouseEntityTypeName AS "@WarehouseEntityTypeName",
EntityGuid AS "@EntityGuid",
CASE WarehouseEntityTypeName
WHEN 'Inbound' THEN 'DateTime'
ELSE 'BatchId' END AS "@WaterMarkType",
WaterMark as "@WaterMark"
FROM #wm
FOR XML path('Entity'), type)
FROM (SELECT DISTINCT ModuleName, ProcessName from #wm) a
FOR XML path('Module'), type)
SELECT @WaterMark as WaterMark, @BatchId as BatchId, @Updated as UpdatedRowCount, @Inserted as InsertedRowCount
END TRY
BEGIN CATCH
DECLARE @errorFmt VARCHAR(256)