TransformCloudServicesVirtualMachineSummaryFactResource (Resource)

Element properties:

TypeResource
File NameTransformCloudServicesVirtualMachineSummaryFact.sql
AccessibilityPublic

Source Code:

<Resource ID="TransformCloudServicesVirtualMachineSummaryFactResource" Accessibility="Public" FileName="TransformCloudServicesVirtualMachineSummaryFact.sql"/>

File Content: TransformCloudServicesVirtualMachineSummaryFact.sql

USE [DWRepository]

GO

/****** Object: StoredProcedure [dbo].[TransformCloudServicesVirtualMachineSummaryFactProc] Script Date: 11/22/2011 16:52:15 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF NOT EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = N'TransformCloudServicesVirtualMachineSummaryFactProc')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[TransformCloudServicesVirtualMachineSummaryFactProc] @WaterMark xml AS RETURN 1')
END

GO


ALTER PROCEDURE [dbo].[TransformCloudServicesVirtualMachineSummaryFactProc](@WaterMark XML)
AS BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON

DECLARE @utc DATETIME = GETUTCDATE()
DECLARE @errorNumber INT,
@errorSeverity INT,
@errorState INT,
@errorLine INT,
@errorProcedure NVARCHAR(256),
@errorMessage NVARCHAR(MAX),
@task NVARCHAR(512)

DECLARE @batchId INT = 0,
@WaterMarkBatchId INT,
@Updated INT = 0,
@Inserted INT = 0,
@retval INT = -1,
@err INT = 0,
@startTranCount INT = @@TRANCOUNT,
@source1WM DATETIME,
@source1MaxWM DATETIME,
@startTime DATETIME,
@batchSize INT,
@processedRowCount INT = 0,
@rejectedRowCount INT = 0,
@rowsToProcess INT = 0

DECLARE @loopCount INT = 0,
@canContinue BIT = 1,
@rc INT = 1,
@level INT = 1

DECLARE @transformName SYSNAME = 'TransformCloudServicesVirtualMachineSummaryFactProc'
SELECT @source1MaxWM = @utc,
@startTime = @utc

BEGIN TRY


--Shred Watermark and get BatchId and present watermarked BatchId
SELECT @task = 'Shredding WaterMark'
SELECT * INTO #tempTable
FROM etl.ShredWaterMark(@WaterMark)

SELECT @task = 'Reading WaterMark for @WaterMarkBatchId and @BatchId'
SELECT @WaterMarkBatchId = WaterMark, @BatchId = BatchId
FROM #tempTable
WHERE WarehouseEntityName = N'CloudServicesVirtualMachineDailyFact' AND WaterMarkType = 'BatchId'

SELECT @task = 'Dropping DWTemp tables'

IF OBJECT_ID('DWTemp.MaxDayKeyTable') IS NOT NULL
DROP TABLE DWTemp.MaxDayKeyTable


IF OBJECT_ID('DWTemp.TransformCloudServicesVirtualMachineSummaryFactProc_Source1') IS NOT NULL
DROP TABLE DWTemp.TransformCloudServicesVirtualMachineSummaryFactProc_Source1

-- read the max DateKey from SummaryFact. If it is null, then read the min dateKey from the VirtualMachineDailyFact
SELECT @task = 'Reading MAX DateKey into DWTemp.MaxDayKeyTable'

SELECT ISNULL(MAX(vmSummaryView.DateKey), MIN(vmDailyView.DateKey)) as MaxDayKey,
vmDailyView.CloudServicesVirtualMachineDimKey
INTO DWTemp.MaxDayKeyTable
FROM dbo.CloudServicesVirtualMachineDailyFactvw vmDailyView
LEFT JOIN dbo.CloudServicesVirtualMachineSummaryFactvw vmSummaryView
ON vmSummaryView.CloudServicesVirtualMachineDimKey = vmDailyView.CloudServicesVirtualMachineDimKey
GROUP BY vmDailyView.CloudServicesVirtualMachineDimKey

SELECT @task = 'Read the latest costs from DailyFacts, and store the final summary in Source1'
SELECT
vmDaily.DateKey,
vmDaily.CloudServicesVirtualMachineDimKey,
CAST(vmDaily.CPUCountMeasure * costSettingsDaily.PerUnitCPUCostMeasure AS FLOAT) AS CPUCostMeasure,
CAST(vmDaily.MemoryGBMeasure * costSettingsDaily.PerUnitMemoryCostMeasure AS FLOAT) AS MemoryCostMeasure,
CAST(vmDaily.StorageGBMeasure * costSettingsDaily.PerUnitStorageCostMeasure AS FLOAT) AS StorageCostMeasure,
CAST(costSettingsDaily.PerDayMiscellaneousCostMeasure AS FLOAT) AS MiscellaneousCostMeasure

INTO DWTemp.TransformCloudServicesVirtualMachineSummaryFactProc_Source1
FROM dbo.CloudServicesVirtualMachineDailyFactvw vmDaily
LEFT JOIN dbo.CloudServicesVMCostSettingsDailyFactvw costSettingsDaily
ON vmDaily.DateKey = costSettingsDaily.DateKey
INNER JOIN DWTemp.MaxDayKeyTable dateTable
ON vmDaily.CloudServicesVirtualMachineDimKey = dateTable.CloudServicesVirtualMachineDimKey
AND vmDaily.DateKey >= dateTable.MaxDayKey
WHERE vmDaily.[IsActive] = 1

BEGIN TRANSACTION -- Start

-- update the information back to the SummaryFact for the existing Data
SELECT @task = 'Updating CloudServicesVirtualMachineSummaryFactvw'
UPDATE vmSummary SET
vmSummary.CPUCostMeasure = T.CPUCostMeasure,
vmSummary.MemoryCostMeasure = T.MemoryCostMeasure,
vmSummary.StorageCostMeasure = T.StorageCostMeasure,
vmSummary.MiscellaneousCostMeasure = T.MiscellaneousCostMeasure,
vmSummary.TotalCostMeasure = T.CPUCostMeasure + T.StorageCostMeasure + T.MemoryCostMeasure + T.MiscellaneousCostMeasure,
UpdatedBatchId = @BatchId
FROM dbo.CloudServicesVirtualMachineSummaryFactvw AS vmSummary
INNER JOIN DWTemp.TransformCloudServicesVirtualMachineSummaryFactProc_Source1 AS T
ON vmSummary.DateKey = T.DateKey AND
vmSummary.CloudServicesVirtualMachineDimKey = T.CloudServicesVirtualMachineDimKey AND
(vmSummary.CPUCostMeasure <> T.CPUCostMeasure OR
vmSummary.MemoryCostMeasure <> T.MemoryCostMeasure OR
vmSummary.StorageCostMeasure <> T.StorageCostMeasure OR
vmSummary.MiscellaneousCostMeasure <> T.MiscellaneousCostMeasure)
WHERE T.CPUCostMeasure IS NOT NULL AND
T.MemoryCostMeasure IS NOT NULL AND
T.StorageCostMeasure IS NOT NULL AND
T.MiscellaneousCostMeasure IS NOT NULL

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

-- DELETE THE ROWS FROM DWTemp.TransformCloudServicesVirtualMachineSummaryFactProc_Source1, which are already inserted
SELECT @task = 'Deleting Already updated rows from temp Table'
DELETE source1
FROM DWTemp.TransformCloudServicesVirtualMachineSummaryFactProc_Source1 source1
INNER JOIN dbo.CloudServicesVirtualMachineSummaryFactvw AS vwSummary
ON vwSummary.DateKey = source1.DateKey AND
vwSummary.CloudServicesVirtualMachineDimKey = source1.CloudServicesVirtualMachineDimKey

-- Finally, insert into the Summary fact
SELECT @task = 'Inserting into CloudServicesVirtualMachineSummaryFactvw'

INSERT INTO dbo.CloudServicesVirtualMachineSummaryFactvw (
CloudServicesVirtualMachineDimKey,
CloudServicesTenantDimKey,
CloudServicesSubscriptionDimKey,
DateKey,
CPUCostMeasure,
MemoryCostMeasure,
StorageCostMeasure,
MiscellaneousCostMeasure,
TotalCostMeasure,
InsertedBatchId,
UpdatedBatchId
)
SELECT DISTINCT
source1.CloudServicesVirtualMachineDimKey,
projectToCapacityFact.CloudServicesTenantDimKey,
capacityToVMFact.CloudServicesSubscriptionDimKey,
source1.DateKey,
source1.CPUCostMeasure,
source1.MemoryCostMeasure,
source1.StorageCostMeasure,
source1.MiscellaneousCostMeasure,
source1.CPUCostMeasure + source1.MemoryCostMeasure + source1.StorageCostMeasure + source1.MiscellaneousCostMeasure,
@batchId AS InsertedBatchId,
0 AS UpdatedBatchId
FROM DWTemp.TransformCloudServicesVirtualMachineSummaryFactProc_Source1 source1
INNER JOIN dbo.CloudServicesVirtualMachineDimvw vmDim
ON vmDim.CloudServicesVirtualMachineDimKey = source1.CloudServicesVirtualMachineDimKey
LEFT JOIN dbo.CloudServicesSubscriptionRelatesToVirtualMachineFactvw capacityToVMFact
ON capacityToVMFact.SubscriptionRelatesToVirtualMachine_CloudServicesVirtualMachineDimKey = source1.CloudServicesVirtualMachineDimKey
LEFT JOIN dbo.CloudServicesTenantContainsSubscriptionFactvw projectToCapacityFact
ON projectToCapacityFact.TenantContainsSubscription_CloudServicesSubscriptionDimKey = capacityToVMFact.CloudServicesSubscriptionDimKey
WHERE source1.CPUCostMeasure IS NOT NULL AND
source1.MemoryCostMeasure IS NOT NULL AND
source1.StorageCostMeasure IS NOT NULL AND
source1.MiscellaneousCostMeasure IS NOT NULL

SELECT @Inserted = @Inserted + @@ROWCOUNT, @err = @@error

COMMIT TRANSACTION --End
--PRINT N'End of Body'

-- update watermark
BEGIN
SELECT @task = 'Updating WaterMark'
UPDATE #tempTable SET
WaterMark = @BatchId
WHERE WarehouseEntityName = N'CloudServicesVirtualMachineDailyFact'
AND WaterMarkType= N'BatchId'
END

SELECT @task = 'Preparing WaterMark for returning'
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



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

IF OBJECT_ID('DWTemp.MaxDayKeyTable') IS NOT NULL
DROP TABLE DWTemp.MaxDayKeyTable


IF OBJECT_ID('DWTemp.TransformCloudServicesVirtualMachineSummaryFactProc_Source1') IS NOT NULL
DROP TABLE DWTemp.TransformCloudServicesVirtualMachineSummaryFactProc_Source1

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

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

SET XACT_ABORT OFF
SET NOCOUNT OFF
END


GO

--Update the Data Retention policy to 3 months:

DECLARE @dataRetentionTimeInMinutes INT = 129600 -- 3 * 30 * 24 * 60 = 129600 (3 months)

UPDATE gi SET gi.RetentionPeriodInMinutes = @dataRetentionTimeInMinutes
FROM etl.WarehouseEntity we
INNER JOIN etl.WarehouseEntityGroomingInfo gi
ON we.WarehouseEntityId = gi.WarehouseEntityId
WHERE we.WarehouseEntityName = 'CloudServicesVirtualMachineSummaryFact'
AND gi.RetentionPeriodInMinutes != @dataRetentionTimeInMinutes

GO