InstallTransformApplicabilityGroupDimResource (Resource)

Element properties:

TypeResource
File NameInstallTransformApplicabilityGroupDim.sql
AccessibilityPublic

Source Code:

<Resource ID="InstallTransformApplicabilityGroupDimResource" Accessibility="Public" FileName="InstallTransformApplicabilityGroupDim.sql"/>

File Content: InstallTransformApplicabilityGroupDim.sql



/****** Object: StoredProcedure [dbo].[TransformApplicabilityGroupDimProc] Script Date: 05/10/2010 01:44:34 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TransformApplicabilityGroupDimProc]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[TransformApplicabilityGroupDimProc]
GO

/****** Object: StoredProcedure [dbo].[TransformApplicabilityGroupDimProc] Script Date: 05/10/2010 01:44:34 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



CREATE PROCEDURE [dbo].[TransformApplicabilityGroupDimProc](@WaterMark XML)
AS BEGIN
SET NOCOUNT ON

DECLARE @errorNumber INT, @errorSeverity INT, @errorState INT, @errorLine INT, @errorProcedure NVARCHAR(256), @errorMessage NVARCHAR(MAX), @task NVARCHAR(512)
DECLARE @BatchId INT, @Updated INT = 0, @Inserted INT = 0, @Count INT, @retval INT = -1, @err INT = 0, @startTranCount INT = @@TRANCOUNT, @source1WM DATETIME, @source1MaxWM DATETIME

BEGIN TRY
SELECT @task = 'Shredding WaterMark'
SELECT * INTO #tempTable FROM etl.ShredWaterMark(@WaterMark)

SELECT @task = 'Reading WaterMark for @source1WM, @BatchId and @source1MaxWM'
SELECT @source1WM = WaterMark, @BatchId = BatchId, @source1MaxWM = MaxWaterMark
FROM #tempTable
WHERE WarehouseEntityName='MTV_System$Compliance$ApplicabilityGroup'
AND WaterMarkType='DateTime'

IF(@source1WM = ISNULL(@source1MaxWM, @source1WM)) SET @source1MaxWM = GETUTCDATE()

BEGIN TRANSACTION
SELECT @task = 'Infer DatasourceDim'
EXEC @err = dbo.InferDatasourceDimProc
@sourceTableName = 'inbound.MTV_System$Compliance$ApplicabilityGroup',
@columnName = 'DataSourceId',
@filterColumnName = 'DWTimeStamp',
@minTimeStamp = @source1WM,
@maxTimeStamp = @source1MaxWM,
@batchId = @BatchId

SELECT @task = 'Preparing #transformTemp1'
;WITH TopRecordFromSource (

[System.Entity!DisplayName],
[System.ConfigItem!Notes],

[System.ConfigItem!AssetStatus],
[System.ConfigItem!ObjectStatus],
BaseManagedEntityId,
DatasourceId,
RowNumber
) AS (
SELECT

source.[System.Entity!DisplayName],
source.[System.ConfigItem!Notes],

source.[System.ConfigItem!AssetStatus],
source.[System.ConfigItem!ObjectStatus],
BaseManagedEntityId,
DatasourceId,
ROW_NUMBER() OVER (PARTITION BY BaseManagedEntityId , DatasourceId ORDER BY DWTimestamp DESC, BaseManagedEntityId) as RowNumber
FROM inbound.MTV_System$Compliance$ApplicabilityGroup source
WHERE source.DWTimestamp >= @source1WM
AND source.DWTimestamp < @source1MaxWM

)
SELECT *
INTO #transformTemp1
FROM TopRecordFromSource source
WHERE source.RowNumber = 1

SELECT @task = 'Adding Clustered Index to #transformTemp1'
DECLARE @temp UNIQUEIDENTIFIER = NEWID()
DECLARE @t NVARCHAR(MAX) = 'CREATE CLUSTERED INDEX [CI1_' + CAST(@temp AS VARCHAR(64)) + '] ON #transformTemp1(BaseManagedEntityId, DatasourceId)'
EXEC(@t)

SELECT @task = 'Updating Dimension'
UPDATE dest SET

[DisplayName] = source.[System.Entity!DisplayName],
[Notes] = source.[System.ConfigItem!Notes],
[AssetStatus_ConfigItemAssetStatusId] = outriggerSrc1.[ConfigItemAssetStatusId],
[AssetStatus] = outriggerSrc1.ID,
[ObjectStatus_ConfigItemObjectStatusId] = outriggerSrc2.[ConfigItemObjectStatusId],
[ObjectStatus] = outriggerSrc2.ID,
[IsDeleted] = baseEntityDim.[IsDeleted],
[SourceId] = source.[DatasourceId],
[UpdatedBatchId] = @BatchId
FROM #transformTemp1 source
INNER JOIN dbo.EntityDim baseEntityDim ON (source.BaseManagedEntityId = baseEntityDim.BaseManagedEntityId AND source.DatasourceId = baseEntityDim.SourceId)
INNER JOIN dbo.ApplicabilityGroupDimvw dest ON (source.BaseManagedEntityId = dest.BaseManagedEntityId AND source.DatasourceId = dest.SourceId)

LEFT JOIN dbo.ConfigItemAssetStatus outriggerSrc1 ON (outriggerSrc1.EnumTypeId = source.[System.ConfigItem!AssetStatus])
LEFT JOIN dbo.ConfigItemObjectStatus outriggerSrc2 ON (outriggerSrc2.EnumTypeId = source.[System.ConfigItem!ObjectStatus])
WHERE dest.BaseManagedEntityId is not null

SELECT @Updated=@@RowCount,@err=@@error

IF(@err<>0)
BEGIN
RAISERROR('Failed to update ApplicabilityGroupDim Dimension', 16,1)
ROLLBACK TRAN
RETURN
END

SELECT @task = 'Inserting into Dimension'
INSERT INTO dbo.ApplicabilityGroupDimvw (
[BaseManagedEntityId],
[EntityDimKey],
[DisplayName],
[Notes],
[AssetStatus_ConfigItemAssetStatusId],
[AssetStatus],
[ObjectStatus_ConfigItemObjectStatusId],
[ObjectStatus],
[IsDeleted],
[SourceId],
[InsertedBatchId],
[UpdatedBatchId]
)
SELECT DISTINCT
baseEntityDim.BaseManagedEntityId,
baseEntityDim.EntityDimKey,
source.[System.Entity!DisplayName],
source.[System.ConfigItem!Notes],
outriggerSrc1.[ConfigItemAssetStatusId],
outriggerSrc1.[ID],
outriggerSrc2.[ConfigItemObjectStatusId],
outriggerSrc2.[ID],
baseEntityDim.[IsDeleted],
source.[DatasourceId],
@BatchId,
0
FROM #transformTemp1 source
INNER JOIN dbo.EntityDim baseEntityDim ON (source.BaseManagedEntityId = baseEntityDim.BaseManagedEntityId AND source.DatasourceId = baseEntityDim.SourceId)
LEFT JOIN dbo.ApplicabilityGroupDimvw dest ON (source.BaseManagedEntityId = dest.BaseManagedEntityId AND source.DatasourceId = dest.SourceId)

LEFT JOIN dbo.ConfigItemAssetStatus outriggerSrc1 ON (outriggerSrc1.EnumTypeId = source.[System.ConfigItem!AssetStatus])
LEFT JOIN dbo.ConfigItemObjectStatus outriggerSrc2 ON (outriggerSrc2.EnumTypeId = source.[System.ConfigItem!ObjectStatus])
WHERE dest.BaseManagedEntityId is null

select @Inserted=@@RowCount,@err=@@error

IF(@err<>0)
BEGIN
RAISERROR('Failed to insert into ApplicabilityGroupDim Dimension', 16,1)
ROLLBACK TRAN
RETURN
END

--
-- Deleted instances do not reach the Staging tables.
-- These events go to Inbound.BME and then to Repository dbo.EntityDim
-- This the reason for the following UPDATE.
-- Make sure to filter data to the current batch
-- and to only records where IsDeleted values do not match
--
SELECT @task = 'Updating Dimension for IsDeleted from EntityDim'
UPDATE dest SET
dest.IsDeleted = baseEntityDim.IsDeleted,
dest.[UpdatedBatchId] = @BatchId
FROM dbo.EntityDim baseEntityDim
INNER JOIN dbo.ApplicabilityGroupDimvw dest ON (baseEntityDim.EntityDimKey = dest.EntityDimKey)
WHERE baseEntityDim.UpdatedBatchId = @BatchId
AND dest.IsDeleted <> baseEntityDim.IsDeleted

IF(@err <> 0)
BEGIN
RAISERROR('Failed to update IsDeleted flags in Dimension', 16,1)
ROLLBACK TRAN
RETURN
END

select Source.*
into #temp2
FROM inbound.MTV_System$Compliance$ApplicabilityGroup source
LEFT JOIN dbo.EntityDim baseEntityDim ON (source.BaseManagedEntityId = baseEntityDim.BaseManagedEntityId AND source.DatasourceId = baseEntityDim.SourceId)
WHERE source.DWTimestamp >= @source1WM AND source.DWTimestamp < @source1MaxWM
AND baseEntityDim.BaseManagedEntityId is null

select @Count = COUNT(*) from #temp2

--IF(@err <> 0)
--BEGIN
-- RAISERROR('Failed to update inbound table for Dimension', 16,1)
-- ROLLBACK TRAN
-- RETURN
--END


COMMIT TRANSACTION

SELECT @task = 'Update #tempTable for WaterMark'

IF(@count > 0) -- we have early arriving data
BEGIN
UPDATE #tempTable SET WaterMark = CONVERT(nvarchar(64), WaterMark,109)
WHERE WarehouseEntityName='MTV_System$Compliance$ApplicabilityGroup' AND WaterMarkType='DateTime'
END
ELSE
UPDATE #tempTable SET WaterMark = CONVERT(nvarchar(64), ISNULL(@source1MaxWM,WaterMark),109)
WHERE WarehouseEntityName='MTV_System$Compliance$ApplicabilityGroup' AND WaterMarkType='DateTime'


IF(@err <> 0)
BEGIN
RAISERROR('Failed to update set watermark', 16,1)
RETURN
END

SELECT @task = 'Building output Watermark XML'
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' WHEN 'Enumeration' THEN 'DateTime' ELSE 'BatchId' END AS "@WaterMarkType",
CASE WarehouseEntityTypeName WHEN 'Inbound' THEN CONVERT(nvarchar(64), WaterMark, 109) WHEN 'Enumeration' THEN CONVERT(nvarchar(64), WaterMark, 109) ELSE CAST(@BatchId AS nvarchar(64)) END AS "@WaterMark"
FROM #tempTable
FOR xml path('Entity'),type)
FROM (SELECT DISTINCT ModuleName, ProcessName FROM #tempTable) a
FOR xml path('Module'),type)

SELECT @WaterMark AS WaterMark, @BatchId AS BatchId, @Updated AS UpdatedRowCount, @Inserted AS InsertedRowCount

SELECT @task = 'Cleaning up by deleting temp tables no longer needed'
IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL DROP TABLE #tempTable
IF OBJECT_ID('tempdb..#transformTemp1') IS NOT NULL DROP TABLE #transformTemp1
IF OBJECT_ID('tempdb..#temp2') IS NOT NULL DROP TABLE #temp2
END TRY
BEGIN CATCH
DECLARE @errorFmt VARCHAR(256)

SELECT @errorFmt = N'ErrorNumber="%d" Message="%s" Severity="%d" State="%d" ProcedureName="%s" LineNumber="%d" Task="%s"',
@errorNumber = ERROR_NUMBER(), @errorMessage = ERROR_MESSAGE(), @errorSeverity = ERROR_SEVERITY(), @errorState = ERROR_STATE(), @errorLine = ERROR_LINE(), @errorProcedure = ERROR_PROCEDURE()

IF(@@TRANCOUNT > @startTranCount) ROLLBACK TRANSACTION

IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL DROP TABLE #tempTable
IF OBJECT_ID('tempdb..#transformTemp1') IS NOT NULL DROP TABLE #transformTemp1
IF OBJECT_ID('tempdb..#temp2') IS NOT NULL DROP TABLE #temp2

RAISERROR (@errorFmt, 18, @errorState, @errorNumber, @errorMessage, @errorSeverity, @errorState, @errorProcedure, @errorLine, @task)
RETURN -1
END CATCH

SET NOCOUNT OFF
END
GO