Veeam.Report.Library.Veeam_GRL_TABLES

Veeam.Report.Library.Veeam_GRL_TABLES (DataWarehouseScript)

Element properties:

Install ScriptRes.Veeam.Report.Library.Veeam_GRL_TABLES.Install
Uninstall ScriptRes.Veeam.Report.Library.Veeam_GRL_TABLES.Uninstall
Upgrade ScriptRes.Veeam.Report.Library.Veeam_GRL_TABLES.Upgrade
Upgrade UnsupportedFalse
AccessibilityInternal

Source Code:

<DataWarehouseScript ID="Veeam.Report.Library.Veeam_GRL_TABLES" Accessibility="Internal">
<Install>-- ##### Veeam_GRL_TABLES_Create.sql

IF OBJECT_ID('dbo.Veeam_GRL_Report') IS NULL
BEGIN
CREATE TABLE dbo.Veeam_GRL_Report
(
ReportId INT NOT NULL IDENTITY,
ReportSystemName NVARCHAR(256) NOT NULL,
ReportDisplayName NVARCHAR(512) NOT NULL,
ReportDescription NVARCHAR(MAX) NULL,
ReportTargetManagementEntityTypeSystemName NVARCHAR(256) NULL,
LinkedInd BIT,
BaseReportId INT NULL,
MPSystemName NVARCHAR(512) NOT NULL,
Options XML NULL,
CONSTRAINT PK_Veeam_GRL_Report PRIMARY KEY (ReportId),
CONSTRAINT AK_Veeam_GRL_Report__ReportSystemName UNIQUE (ReportSystemName),
CONSTRAINT FK_Veeam_GRL_Report__Veeam_GRL_Report FOREIGN KEY (BaseReportId) REFERENCES [dbo].[Veeam_GRL_Report] (ReportId)
)
END
ELSE IF NOT EXISTS (
SELECT *
FROM
sys.objects o
INNER JOIN sys.schemas s ON s.[schema_id] = o.[schema_id]
INNER JOIN sys.[columns] c ON c.[object_id]=o.[object_id]
WHERE
s.name='dbo'
AND o.name='Veeam_GRL_Report'
AND c.name='Options'
AND o.[type]='U'
)
BEGIN
ALTER TABLE dbo.Veeam_GRL_Report
ADD Options XML NULL
END

IF OBJECT_ID('dbo.Veeam_GRL_MeasurementUnit') IS NULL
BEGIN
CREATE TABLE dbo.Veeam_GRL_MeasurementUnit
(
MeasurementUnitId INT NOT NULL IDENTITY,
MeasurementUnitName NVARCHAR(256),
CONSTRAINT PK_Veeam_GRL_MeasurementUnit PRIMARY KEY(MeasurementUnitId),
CONSTRAINT AK_Veeam_GRL_MeasurementUnit__MeasurementUnitName UNIQUE (MeasurementUnitName)
)
END

IF OBJECT_ID('dbo.Veeam_GRL_PerformanceRule') IS NULL
BEGIN
CREATE TABLE dbo.Veeam_GRL_PerformanceRule
(
PerformanceRuleId INT NOT NULL IDENTITY,
RuleSystemName NVARCHAR(256) NOT NULL,
MeasurementUnitId INT NOT NULL,
DefaultAggregationFunction VARCHAR(10) NOT NULL,
DefaultScale FLOAT NOT NULL DEFAULT 1.0,
HiddenInd BIT NOT NULL DEFAULT 0,
URL NVARCHAR(MAX) NULL,
ParentPerformanceRuleId INT NULL,
MPSystemName NVARCHAR(512) NOT NULL,
CONSTRAINT PK_Veeam_GRL_PerformanceRule PRIMARY KEY(PerformanceRuleId),
CONSTRAINT FK_Veeam_GRL_PerformanceRule__Veeam_GRL_MeasurementUnit FOREIGN KEY (MeasurementUnitId) REFERENCES Veeam_GRL_MeasurementUnit(MeasurementUnitId),
CONSTRAINT FK_Veeam_GRL_PerformanceRule__Veeam_GRL_PerformanceRule FOREIGN KEY (ParentPerformanceRuleId) REFERENCES Veeam_GRL_PerformanceRule(PerformanceRuleId)
)
END
ELSE IF NOT EXISTS (
SELECT *
FROM
sys.objects o
INNER JOIN sys.schemas s ON s.[schema_id] = o.[schema_id]
INNER JOIN sys.[columns] c ON c.[object_id]=o.[object_id]
WHERE
s.name='dbo'
AND o.name='Veeam_GRL_PerformanceRule'
AND c.name='URL'
AND o.[type]='U'
)
BEGIN
ALTER TABLE dbo.Veeam_GRL_PerformanceRule
ADD [URL] NVARCHAR(MAX) NULL
END


IF OBJECT_ID('dbo.Veeam_GRL_ReportPerformanceRule') IS NULL
BEGIN
CREATE TABLE dbo.Veeam_GRL_ReportPerformanceRule
(
PerformanceReportRuleId INT NOT NULL IDENTITY,
ReportId INT NOT NULL,
PerformanceRuleId INT NOT NULL,
MPSystemName NVARCHAR(512) NOT NULL,
CONSTRAINT PK_Veeam_GRL_PerformanceReportRule PRIMARY KEY (PerformanceReportRuleId),
CONSTRAINT FK_Veeam_GRL_PerformanceReportRule__Veeam_GRL_Report FOREIGN KEY (ReportId) REFERENCES [dbo].[Veeam_GRL_Report] (ReportId),
CONSTRAINT FK_Veeam_GRL_ReportPerformanceRule__Veeam_GRL_PerformanceRule FOREIGN KEY (PerformanceRuleId) REFERENCES [dbo].[Veeam_GRL_PerformanceRule] (PerformanceRuleId),
CONSTRAINT AK_Veeam_GRL_ReportPerformanceRule__ReportId_PerformanceRuleId UNIQUE (ReportId,PerformanceRuleId)
)
END

IF OBJECT_ID('dbo.Veeam_GRL_ColorCode') IS NULL
BEGIN
CREATE TABLE dbo.Veeam_GRL_ColorCode
(
ColorCodeRowId INT NOT NULL,
ColorCode NVARCHAR(64) NOT NULL,
CONSTRAINT PK_Veeam_GRL_ColorCode PRIMARY KEY (ColorCodeRowId)
)
END

GRANT SELECT ON dbo.Veeam_GRL_Report TO OpsMgrReader
GRANT SELECT ON dbo.Veeam_GRL_MeasurementUnit TO OpsMgrReader
GRANT SELECT ON dbo.Veeam_GRL_PerformanceRule TO OpsMgrReader
GRANT SELECT ON dbo.Veeam_GRL_ReportPerformanceRule TO OpsMgrReader
GRANT SELECT ON dbo.Veeam_GRL_ColorCode TO OpsMgrReader

----- temporary objects and data
IF OBJECT_ID('tempdb..#Veeam_GRL_Report') IS NOT NULL DROP TABLE #Veeam_GRL_Report

CREATE TABLE #Veeam_GRL_Report
(
ReportSystemName NVARCHAR(256) NOT NULL,
ReportDisplayName NVARCHAR(512) NOT NULL,
ReportDescription NVARCHAR(MAX) NULL,
ReportTargetManagementEntityTypeSystemName NVARCHAR(256) NULL,
LinkedInd BIT,
BaseReportId INT NULL,
MPSystemName NVARCHAR(512) NOT NULL,
Options XML NULL
)

----- Add reports

-- Generic performance report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericPerformance.report',
'Performance',
'The Veeam Performance Report is a generic report that aggregates historical data and shows performance counter values for selected infrastructure objects over time. This report extends the functionality of the Microsoft Generic Report library by adding the following advanced features: showing group, object and performance counter instance average values on the chart, showing daily/hourly values in the report table.',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic performance detail report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericPerformanceDetail.report',
'Performance Details',
'The Veeam Performance Details Report is a generic report that aggregates historical data and shows performance counter values for selected infrastructure objects over time. This report extends the functionality of the Microsoft Generic Report library by adding the following advanced features: showing performance trend, drilling-down to data collected for specific objects/performance counter instances included into the report scope.',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic top/bottom report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericPerformanceTopBottom.report',
'Performance Top (Bottom) N',
'The Veeam Performance Top (Bottom) N Report is a generic report that aggregates historical performance data and shows top (or bottom) N infrastructure objects, performance counter instances or both for a specific performance counter rule. This report extends the functionality of the Microsoft Generic Report library by adding the following advanced features: including objects and/or instances into the report scope, advanced grouping and sorting options, daily and hourly levels of data aggregation.',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic alert stats report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericAlertStats.report',
'Alert Statistics',
'The Veeam Alert Statistics Report is a generic report that shows the alerting activity for given filter parameters. This report extends the functionality of the Microsoft Generic Report library by adding the following advanced features: showing per-rule/monitor and per-object alert statistics, providing two levels of detail, comparing the alerting activity for two time intervals and management pack selection.',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic alert history report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericAlertHistory.report',
'Alert History',
'The Veeam Alert History Report provides information on alerts raised for infrastructure objects across a time range. This report helps you to review the health state of the environment for the specified time range in the past. The report details how many alerts with different severity and priority levels were raised on each day of the reporting period.',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic state report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName,
Options
)
VALUES
(
'Veeam.Report.Library.GenericState.report',
'State Summary',
'The Veeam State Summary Report shows the time in healthy/unhealthy state for selected infrastructure objects'' monitor across a time range.',
0,
NULL,
'Veeam.Report.Library',
'&lt;SortModes&gt;
&lt;SortMode Value="D" Label="Object Type, Monitor and Object Names" /&gt;
&lt;SortMode Value="1ut" Label="1st Interval - Up Time" /&gt;
&lt;SortMode Value="1up" Label="1st Interval - Up Time %" /&gt;
&lt;SortMode Value="1dt" Label="1st Interval - Down Time" /&gt;
&lt;SortMode Value="1dp" Label="1st Interval - Down Time %" /&gt;
&lt;SortMode Value="2ut" Label="2nd Interval - Up Time" /&gt;
&lt;SortMode Value="2up" Label="2nd Interval - Up Time %" /&gt;
&lt;SortMode Value="2dt" Label="2nd Interval - Down Time" /&gt;
&lt;SortMode Value="2dp" Label="2nd Interval - Down Time %" /&gt;
&lt;SortMode Value="c" Label="Change (pp)" /&gt;
&lt;/SortModes&gt;'
)

-- Generic state details report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericStateDetails.report',
'State Details',
'The Veeam State Summary Report shows the time in healthy/unhealthy state for selected infrastructure objects'' monitor across a time range.',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic snapshot summar report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericVMSnapshot.report',
'Snapshot Summary Generic Report',
'Generic report with grouped snapshot metadata for virtual machines',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic relationship history report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName,
Options
)
VALUES
(
'Veeam.Report.Library.GenericRelationshipHistory.report',
'Relationship History',
'The Veeam Relationship History Report allows you to choose a specific type of relationship between infrastructure objects and track changes for this relationship over a time interval.',
0,
NULL,
'Veeam.Report.Library',
'&lt;RelationTypeParties&gt;&lt;RelationTypeParty Value="S" Label="Source" /&gt;&lt;RelationTypeParty Value="T" Label="Target" /&gt;&lt;RelationTypeParty Value="ST" Label="Both Source and Target" /&gt;&lt;/RelationTypeParties&gt;'
)

-- Update existing reports
UPDATE vgr
SET
ReportSystemName = r.ReportSystemName,
ReportDisplayName = r.ReportDisplayName,
ReportDescription = r.ReportDescription,
ReportTargetManagementEntityTypeSystemName = r.ReportTargetManagementEntityTypeSystemName,
LinkedInd = r.LinkedInd,
BaseReportId = r.BaseReportId,
MPSystemName = r.MPSystemName,
Options = r.Options
FROM
dbo.Veeam_GRL_Report vgr
INNER JOIN #Veeam_GRL_Report r ON r.ReportSystemName = vgr.ReportSystemName AND r.MPSystemName = vgr.MPSystemName

-- Insert new reports
INSERT dbo.Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
ReportTargetManagementEntityTypeSystemName,
LinkedInd,
BaseReportId,
MPSystemName,
Options
)
SELECT
r.ReportSystemName,
r.ReportDisplayName,
r.ReportDescription,
r.ReportTargetManagementEntityTypeSystemName,
r.LinkedInd,
r.BaseReportId,
r.MPSystemName,
r.Options
FROM
#Veeam_GRL_Report r
LEFT OUTER JOIN dbo.Veeam_GRL_Report vgr ON vgr.ReportSystemName = r.ReportSystemName AND vgr.MPSystemName = r.MPSystemName
WHERE
vgr.ReportId IS NULL

----- drop temporary objects
IF OBJECT_ID('tempdb..#Veeam_GRL_Report') IS NOT NULL DROP TABLE #Veeam_GRL_Report

----- Add color codes
DELETE FROM dbo.Veeam_GRL_ColorCode
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('139,0,0',1)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,100,0',2)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('153,50,204',3)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,0,139',4)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('255,165,0',5)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('178,34,34',6)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('46,139,87',7)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('75,0,130',8)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,0,205',9)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('255,215,0',10)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('220,20,60',11)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('60,179,113',12)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('128,0,128',13)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,0,255',14)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('255,255,0',15)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('255,0,0',16)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,255,127',17)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('72,61,139',18)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('65,105,225',19)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('189,183,107',20)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('255,69,0',21)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,250,154',22)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('148,0,211',23)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('100,149,237',24)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('205,92,92',25)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('50,205,50',26)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('255,0,255',27)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('30,144,255',28)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,255,0',29)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,191,255',30)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('173,255,47',31)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,255,255',0)
GO
-- ##### Veeam_GRL_ObjectListGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ObjectListGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ObjectListGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_ObjectListGet]
@StartDate datetime,
@EndDate datetime, -- relationship should exist within @StartDate..@EndDate interval
@ObjectList XML, -- scope
@ForceContainment BIT = 0, -- disregard 'Self' option, always use containment
@ManagedEntityTypeRowId INT = NULL, -- output only objects of this type within the scope defined by @ObjectList
@MaxLevel INT = NULL, -- max nest level
@XPathType INT = 0, -- 0 - /Data/Objects/Object
-- 1 - /Data/Values/Value/Object
@HostedOnly BIT = 0, -- use only hosted relationship (subclass of containment)
@ManagedEntityTypeFilterRowId INT = NULL, -- All entities of specified type (when no scope is specified)
@XmlOutputOnly BIT = 0,
@OutputXml XML = NULL OUT
AS
BEGIN
BEGIN TRY
IF OBJECT_ID('tempdb..#ObjectList') IS NOT NULL DROP TABLE #ObjectList
IF OBJECT_ID('tempdb..#ContainmentObjectList') IS NOT NULL DROP TABLE #ContainmentObjectList
IF OBJECT_ID('tempdb..#RelationshipType') IS NOT NULL DROP TABLE #RelationshipType
IF OBJECT_ID('tempdb..#ObjectListGetResult') IS NOT NULL DROP TABLE #ObjectListGetResult

CREATE TABLE #ObjectList (
ManagedEntityRowId INT
)

CREATE TABLE #ContainmentObjectList (
ManagedEntityRowId int,
[Level] int
)

CREATE TABLE #RelationshipType (
RelationshipTypeRowId int,
[Level] int
)

CREATE TABLE #ObjectListGetResult (
ManagedEntityRowId INT
)

IF @ObjectList IS NOT NULL
BEGIN
IF @XPathType=1
BEGIN
INSERT INTO #ObjectList (ManagedEntityRowId)
SELECT ObjectList.ManagedEntityRowId.value('.', 'int')
FROM @ObjectList.nodes('/Data/Values/Value/Object') AS ObjectList(ManagedEntityRowId)
WHERE ISNULL(ObjectList.ManagedEntityRowId.value('@Use', 'nvarchar(255)'), 'Self') = 'Self'

INSERT INTO #ContainmentObjectList (ManagedEntityRowId, [Level])
SELECT ObjectList.ManagedEntityRowId.value('.', 'int'), 0
FROM @ObjectList.nodes('/Data/Values/Value/Object') AS ObjectList(ManagedEntityRowId)
WHERE ISNULL(ObjectList.ManagedEntityRowId.value('@Use', 'nvarchar(255)'), 'Self') = 'Containment' OR @ForceContainment = 1
END
ELSE
BEGIN
INSERT INTO #ObjectList (ManagedEntityRowId)
SELECT ObjectList.ManagedEntityRowId.value('.', 'int')
FROM @ObjectList.nodes('/Data/Objects/Object') AS ObjectList(ManagedEntityRowId)
WHERE ISNULL(ObjectList.ManagedEntityRowId.value('@Use', 'nvarchar(255)'), 'Self') = 'Self'

INSERT INTO #ContainmentObjectList (ManagedEntityRowId, [Level])
SELECT ObjectList.ManagedEntityRowId.value('.', 'int'), 0
FROM @ObjectList.nodes('/Data/Objects/Object') AS ObjectList(ManagedEntityRowId)
WHERE ISNULL(ObjectList.ManagedEntityRowId.value('@Use', 'nvarchar(255)'), 'Self') = 'Containment' OR @ForceContainment = 1
END
END
ELSE IF @ObjectList IS NULL AND @ManagedEntityTypeFilterRowId IS NOT NULL
BEGIN
INSERT INTO #ObjectList (ManagedEntityRowId)
SELECT vme.ManagedEntityRowId FROM [dbo].[vManagedEntity] vme WHERE vme.ManagedEntityTypeRowId=@ManagedEntityTypeFilterRowId

INSERT INTO #ContainmentObjectList (ManagedEntityRowId, [Level])
SELECT vme.ManagedEntityRowId, 0 FROM [dbo].[vManagedEntity] vme WHERE vme.ManagedEntityTypeRowId=@ManagedEntityTypeFilterRowId AND @ForceContainment = 1
END

IF EXISTS (SELECT TOP 1 1 FROM #ContainmentObjectList)
BEGIN
DECLARE @ContainmentRelationshipTypeRowId INT
DECLARE @RootRTSystemName NVARCHAR(MAX)

SET @RootRTSystemName = CASE WHEN @HostedOnly = 0 THEN N'System.Containment' ELSE N'System.Hosting' END

SELECT @ContainmentRelationshipTypeRowId = RelationshipTypeRowId FROM [dbo].[vRelationshipType] WHERE RelationshipTypeSystemName = @RootRTSystemName

INSERT #RelationshipType(RelationshipTypeRowId, [Level])
SELECT RelationshipTypeRowId, [Level]
FROM dbo.RelationshipDerivedTypeHierarchy(@ContainmentRelationshipTypeRowId, 0)

DECLARE @CurrentLevel INT, @RowCount INT
SET @CurrentLevel = 1
SET @RowCount = 1

WHILE @RowCount &gt; 0 AND @CurrentLevel&lt;=ISNULL(@MaxLevel,10000)
BEGIN
INSERT INTO #ContainmentObjectList (ManagedEntityRowId, [Level])
SELECT DISTINCT r.TargetManagedEntityRowId, @CurrentLevel
FROM [dbo].[Relationship] r
JOIN [dbo].[RelationshipManagementGroup] rmg ON (r.RelationshipRowId = rmg.RelationshipRowId)
JOIN #RelationshipType rt ON (r.RelationshipTypeRowId = rt.RelationshipTypeRowId)
JOIN #ContainmentObjectList me ON (me.ManagedEntityRowId = r.SourceManagedEntityRowId) AND (me.[Level] = @CurrentLevel - 1)
WHERE (rmg.FromDateTime &lt;= @EndDate OR @EndDate IS NULL) AND (ISNULL(rmg.ToDateTime, '99991231') &gt;= @StartDate OR @StartDate IS NULL)

SELECT @RowCount = @@ROWCOUNT
SET @CurrentLevel = @CurrentLevel + 1
END
END

INSERT INTO #ObjectListGetResult
(
ManagedEntityRowId
)
SELECT o.ManagedEntityRowId
FROM
#ObjectList o
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
WHERE vme.ManagedEntityTypeRowId=@ManagedEntityTypeRowId OR @ManagedEntityTypeRowId IS NULL

UNION

SELECT o.ManagedEntityRowId
FROM
#ContainmentObjectList o
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
WHERE
(vme.ManagedEntityTypeRowId=@ManagedEntityTypeRowId OR @ManagedEntityTypeRowId IS NULL)
AND
(o.[Level]&lt;=@MaxLevel OR @MaxLevel IS NULL)

IF @XmlOutputOnly=1
BEGIN
SET @OutputXml = (SELECT * FROM #ObjectListGetResult FOR XML PATH('Object'), ROOT('Objects'))
END
ELSE SELECT * FROM #ObjectListGetResult

IF OBJECT_ID('tempdb..#ObjectList') IS NOT NULL DROP TABLE #ObjectList
IF OBJECT_ID('tempdb..#ContainmentObjectList') IS NOT NULL DROP TABLE #ContainmentObjectList
IF OBJECT_ID('tempdb..#RelationshipType') IS NOT NULL DROP TABLE #RelationshipType
IF OBJECT_ID('tempdb..#ObjectListGetResult') IS NOT NULL DROP TABLE #ObjectListGetResult

END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#ObjectList') IS NOT NULL DROP TABLE #ObjectList
IF OBJECT_ID('tempdb..#ContainmentObjectList') IS NOT NULL DROP TABLE #ContainmentObjectList
IF OBJECT_ID('tempdb..#RelationshipType') IS NOT NULL DROP TABLE #RelationshipType
IF OBJECT_ID('tempdb..#ObjectListGetResult') IS NOT NULL DROP TABLE #ObjectListGetResult

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ObjectListGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_RulesGetSelected_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_RulesGetSelected')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_RulesGetSelected] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_RulesGetSelected]
@Rules XML
AS
BEGIN
IF @Rules IS NOT NULL
BEGIN
SELECT
RuleName=vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+')'+
CASE WHEN mu.MeasurementUnitName IS NOT NULL THEN ' ['+mu.MeasurementUnitName+']' ELSE '' END,
pr.URL
FROM
[dbo].[vRule] vr
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
INNER JOIN @Rules.nodes('/Data/Values') AS Rules(RuleGuid) ON Rules.RuleGuid.value('.','UNIQUEIDENTIFIER')=vr.RuleGuid
LEFT OUTER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
LEFT OUTER JOIN [dbo].[Veeam_GRL_MeasurementUnit] mu ON mu.MeasurementUnitId = pr.MeasurementUnitId
ORDER BY 1
END
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_RulesGetSelected] TO OpsMgrReader
GO
-- ##### Veeam_GRL_ObjectListGetSelected_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ObjectListGetSelected')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ObjectListGetSelected] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_ObjectListGetSelected]
@ObjectList XML,
@XPathType INT = 0
AS
BEGIN
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj

CREATE TABLE #obj
(
ManagedEntityRowId INT
)

INSERT INTO #obj
(
ManagedEntityRowId
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = null,
@EndDate = null,
@ObjectList = @ObjectList,
@ForceContainment = 0,
@ManagedEntityTypeRowId = null,
@MaxLevel = 0,
@XPathType = @XPathType

SELECT
FullName = vmg.ManagementGroupDefaultName + '\'+
CASE WHEN vme.[Path] IS NOT NULL THEN vme.[Path]+'\' ELSE '' END+
vme.DisplayName,
vmeti.[Image]
FROM
#obj o
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagementGroup] vmg ON vmg.ManagementGroupRowId = vme.ManagementGroupRowId
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] vmeti ON (vmeti.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId AND vmeti.ImageCategory = N'u16x16Icon')

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ObjectListGetSelected] TO OpsMgrReader
GO
-- ##### Veeam_GRL_InstanceListGetSelected_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_InstanceListGetSelected')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_InstanceListGetSelected] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_InstanceListGetSelected]
@RuleId UNIQUEIDENTIFIER,
@InstanceList XML = NULL
AS
BEGIN
IF ISNULL(convert(nvarchar(max),@InstanceList),'')=''
BEGIN
SELECT InstanceName='ALL'
END
ELSE
BEGIN
SELECT DISTINCT
vpri.InstanceName
FROM
[dbo].[vRule] vr
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.RuleRowId = vpr.RuleRowId
INNER JOIN @InstanceList.nodes('/Data/Values') AS InstanceList(InstanceName) ON
InstanceList.InstanceName.value('.', 'nvarchar(256)') = vpri.InstanceName
END
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_InstanceListGetSelected] TO OpsMgrReader
GO
-- ##### Veeam_GRL_ManagementGroupsGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ManagementGroupsGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ManagementGroupsGet] AS RETURN 1')
END
GO

ALTER PROCEDURE [dbo].[Veeam_GRL_ManagementGroupsGet]
@ShowAllMGs TINYINT = 0
AS
SELECT ManagementGroupGuid, ManagementGroupDefaultName
FROM [dbo].[vManagementGroup]
WHERE ((NOT (ConnectConfirmedDateTime IS NULL)) AND (ConnectRejectedind = 0)) OR @ShowAllMGs&gt;0
ORDER BY ManagementGroupDefaultName
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ManagementGroupsGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_PerformanceChartModeGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceChartModeGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_PerformanceChartModeGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_PerformanceChartModeGet]
@SectionMode CHAR(1),
@ReportSystemName NVARCHAR(256)=NULL
AS
BEGIN

SELECT Id, NAME
FROM
(
SELECT Id=0, NAME='Native', SectionMode='N'
UNION ALL
--SELECT 1, 'Instance', 'GOC'
--UNION ALL
SELECT 2, 'Counter', 'GO'
UNION ALL
SELECT 3, 'Counters that have the same measurement unit', 'GO'
UNION ALL
SELECT 4, 'Counters that have the same measurement unit and collected for the same target', 'G'
UNION ALL
SELECT
5, vmet.ManagedEntityTypeDefaultName, 'C'
FROM
[dbo].[Veeam_GRL_Report] r
INNER JOIN [dbo].[vManagedEntityType] vmet ON r.ReportTargetManagementEntityTypeSystemName=vmet.ManagedEntityTypeSystemName
WHERE r.ReportSystemName=@ReportSystemName
UNION ALL
SELECT 6, 'Selected Group/Object', 'C'
UNION ALL
SELECT 7, 'All objects', 'C'
) X
WHERE SectionMode LIKE '%'+@SectionMode+'%'

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_PerformanceChartModeGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_PerformanceRuleGetByReport_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceRuleGetByReport')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_PerformanceRuleGetByReport] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_PerformanceRuleGetByReport]
@ReportSystemName NVARCHAR(256)
AS
BEGIN
IF EXISTS (
SELECT TOP 1 1
FROM
dbo.Veeam_GRL_ReportPerformanceRule rpr
INNER JOIN dbo.Veeam_GRL_Report r ON r.ReportId = rpr.ReportId
INNER JOIN dbo.Veeam_GRL_PerformanceRule pr ON pr.PerformanceRuleId = rpr.PerformanceRuleId
INNER JOIN dbo.vRule vr ON pr.RuleSystemName=vr.RuleSystemName
INNER JOIN dbo.vPerformanceRule vpr ON vpr.RuleRowId = vr.RuleRowId
WHERE r.ReportSystemName=@ReportSystemName
)
BEGIN

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

CREATE TABLE #r
(
PerformanceRuleId INT,
RuleDefaultName NVARCHAR(256),
ObjectCounterName NVARCHAR(MAX),
ObjectCounterDisplayName NVARCHAR(MAX),
RuleGuid UNIQUEIDENTIFIER,
DefaultAggregationFunction VARCHAR(10),
IsHidden BIT,
RuleRank INT
)


INSERT INTO #r
(
PerformanceRuleId,
RuleDefaultName,
ObjectCounterName,
ObjectCounterDisplayName,
RuleGuid,
DefaultAggregationFunction,
IsHidden
)
SELECT
pr.PerformanceRuleId,
vr.RuleDefaultName,
ObjectCounterName=vpr.ObjectName+'\'+vpr.CounterName,
ObjectCounterDisplayName=vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+')',
vr.RuleGuid,
pr.DefaultAggregationFunction,
IsHidden = pr.HiddenInd
FROM
dbo.Veeam_GRL_ReportPerformanceRule rpr
INNER JOIN dbo.Veeam_GRL_Report r ON r.ReportId = rpr.ReportId
INNER JOIN dbo.Veeam_GRL_PerformanceRule pr ON pr.PerformanceRuleId = rpr.PerformanceRuleId
INNER JOIN dbo.vRule vr ON pr.RuleSystemName=vr.RuleSystemName
INNER JOIN dbo.vPerformanceRule vpr ON vpr.RuleRowId = vr.RuleRowId
WHERE r.ReportSystemName=@ReportSystemName

UPDATE r
SET RuleRank = x.RuleRank
FROM
#r r
INNER JOIN
(
SELECT
r.RuleGuid,
RuleRank = ROW_NUMBER() OVER (PARTITION BY r.ObjectCounterName ORDER BY r.IsHidden, r.PerformanceRuleId)
FROM
#r r
) x ON r.RuleGuid=x.RuleGuid

SELECT DISTINCT
PerformanceRuleId,
RuleDefaultName,
ObjectCounterName = ObjectCounterDisplayName,
RuleGuid,
DefaultAggregationFunction
FROM #r
--WHERE RuleRank=1
ORDER BY ObjectCounterDisplayName

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

END
ELSE BEGIN
SELECT
PerformanceRuleId=-1,
RuleDefaultName='Counters are not available yet. Probably data is not collected yet.',
ObjectCounterName='Counters are not available. Probably data is not collected yet.',
RuleGuid='00000000-0000-0000-0000-000000000000',
DefaultAggregationFunction='Avg'
END
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_PerformanceRuleGetByReport] TO OpsMgrReader
GO
-- ##### Veeam_GRL_PerformanceSectionModeGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceSectionModeGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_PerformanceSectionModeGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_PerformanceSectionModeGet]
@ReportMode CHAR(1),
@ReportSystemName NVARCHAR(256)=NULL
AS
BEGIN
SELECT X.Id, X.NAME
FROM
(
SELECT Id='N', NAME='Native', ReportMode='N'
UNION ALL
SELECT
Id='O',
NAME=vmet.ManagedEntityTypeDefaultName,
ReportMode='L'
FROM
[dbo].[Veeam_GRL_Report] r
INNER JOIN [dbo].[vManagedEntityType] vmet ON r.ReportTargetManagementEntityTypeSystemName=vmet.ManagedEntityTypeSystemName
WHERE r.ReportSystemName=@ReportSystemName
UNION ALL
SELECT Id='G', NAME='Selected Group/Object', ReportMode='L'
UNION ALL
SELECT Id='C', NAME='Counter', ReportMode='L'
) X
WHERE x.ReportMode=@ReportMode
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_PerformanceSectionModeGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_ReportDetailsGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ReportDetailsGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ReportDetailsGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_ReportDetailsGet]
@ReportSystemName NVARCHAR(256)
AS
BEGIN
IF EXISTS(SELECT TOP 1 1 FROM [dbo].[Veeam_GRL_Report] r WHERE r.ReportSystemName=@ReportSystemName)
SELECT
ReportDefaultName = r.ReportDisplayName,
ReportDefaultDescription = CASE WHEN len(isnull(r.ReportDescription,''))&gt;0 THEN r.ReportDescription ELSE 'Description for this report is not available.' END,
MPSystemName = vmp.ManagementPackSystemName,
MPName = Replace(isnull(vmp.ManagementPackDefaultName,''),'Veeam ','')
FROM
[dbo].[Veeam_GRL_Report] r LEFT OUTER JOIN
[dbo].[vManagementPack] vmp ON r.MPSystemName=vmp.ManagementPackSystemName
WHERE r.ReportSystemName=@ReportSystemName
ELSE
SELECT
ReportDefaultName = 'Generic Report',
ReportDefaultDescription = 'Veeam generic report',
MPSystemName = vmp.ManagementPackSystemName,
MPName = Replace(vmp.ManagementPackDefaultName,'Veeam ','')
FROM
[dbo].[vManagementPack] vmp
WHERE vmp.ManagementPackSystemName='Veeam.Report.Library'
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ReportDetailsGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_PerformanceGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_PerformanceGet] AS RETURN 1')
END
GO

ALTER PROCEDURE [dbo].[Veeam_GRL_PerformanceGet]
@dtStart DATETIME,
@dtEnd DATETIME,
@config XML,
@DataAgg TINYINT, -- 1 - Daily, 0 - Hourly
@ReportId NVARCHAR(256) = NULL,
@DataMode VARCHAR(16) = 'GOI',
@SectionMode CHAR(1) = 'N', -- see [Veeam_GRL_PerformanceSectionModeGet]
@ChartMode INT = 0, -- see [Veeam_GRL_PerformanceChartModeGet]
@counters XML = NULL,
@Histogram INT = 0,
@instances XML = NULL,
@enableTrendCalc BIT = 1,
@enableMergeTweek BIT = 1,
@XmlOutputOnly BIT = 0,
@OutputXml XML = NULL OUT
AS
BEGIN
SET NOCOUNT ON

DECLARE @xmldoc_config INT,
@xmldoc_counters INT,
@RowCount INT,
@XmlTrend XML

BEGIN TRY
IF OBJECT_ID('tempdb..#section') IS NOT NULL
DROP TABLE #section

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

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

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

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

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

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

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

CREATE TABLE #section
(
SectionNo INT,
SectionTitle NVARCHAR(max)
)

CREATE TABLE #chart
(
SectionNo INT,
ChartNo INT,
ChartName NVARCHAR(max)
)

CREATE TABLE #seriesGroup
(
ChartNo INT NULL, -- Chart #
[Group] INT, -- native Chart # (Chart XML Node Id)
GroupTitle NVARCHAR(max), -- native Chart title
SeriesGroupNo INT, -- Series # (Series XML Node Id)
ChartScale FLOAT,
ChartType NVARCHAR(255),
ChartColor NVARCHAR(255),
OptionXml XML
)

-- Managed Entities to be used
CREATE TABLE #obj
(
ManagedEntityRowId INT,
SeriesGroupNo INT -- Series # (Series XML Node Id)
)

-- Groups and MEs contained in groups
CREATE TABLE #objGr
(
ManagedEntityRowId INT,
SeriesGroupNo INT,
[Level] INT -- Series # (Series XML Node Id)
)

-- containment relationships
CREATE TABLE #relType
(
RelationshipTypeRowId INT,
[Level] INT
)

-- counter instances (rule instances)
CREATE TABLE #counterInst
(
PerformanceRuleInstanceRowId INT,
PerformanceRuleRowId INT,
InstanceName NVARCHAR(256),
AggFunction VARCHAR(10),
SeriesGroupNo INT, -- Series # (Series XML Node Id)
ParentPerformanceRuleInstanceRowId INT,
ParentPerformanceRuleRowId INT,
MergeCandidateInd BIT DEFAULT 0
)

--raw values
CREATE TABLE #rawValues
(
[RuleRowId] INT,
[PerformanceRuleInstanceRowId] INT,
[ParentRuleRowId] INT,
[ParentPerformanceRuleInstanceRowId] INT,
[InstanceName] NVARCHAR(512),
[ManagedEntityRowId] INT,
[RawManagedEntityRowId] INT,
[TopLevelHostManagedEntityRowId] INT,
[DateTime] DATETIME,
[SampleCount] INT,
[AverageValue] FLOAT,
[MinValue] FLOAT,
[MaxValue] FLOAT,
[StandardDeviation] FLOAT,
[MergeCandidateInd] BIT DEFAULT 0
)

-- final values
CREATE TABLE #values
(
[RowId] INT IDENTITY PRIMARY KEY,
[SectionNo] INT,
[SectionTitle] NVARCHAR(255),
[ChartNo] INT,
[ChartTitle] NVARCHAR(255),
[SeriesGroupNo] INT,
[ChartScale] FLOAT,
[ChartType] NVARCHAR(510),
[ChartColor] NVARCHAR(510),
[RandomColor] NVARCHAR(510),
[ManagementGroupGuid] UNIQUEIDENTIFIER,
[ManagementGroupDefaultName] NVARCHAR(512),
[ManagedEntityTypeDefaultName] NVARCHAR(512),
[Image] VARBINARY(MAX),
[ManagedEntityRowId] INT,
[RawManagedEntityRowId] INT,
[ManagedEntityGuid] UNIQUEIDENTIFIER,
[Path] NVARCHAR(MAX),
[ManagedEntityFullName] NVARCHAR(MAX),
[ManagedEntityDefaultName] NVARCHAR(MAX),
[RuleRowId] INT,
[RuleGuid] UNIQUEIDENTIFIER,
[RuleDefaultName] NVARCHAR(512),
[RuleUrl] NVARCHAR(MAX),
[MeasurementUnitName] NVARCHAR(256),
[AggFunction] VARCHAR(10),
[MultiInstanceInd] BIT,
[ObjectName] NVARCHAR(512),
[CounterName] NVARCHAR(512),
[InstanceName] NVARCHAR(512),
[ObjInstNo] INT,
[ValueNo] BIGINT,
[ValueLabel] NVARCHAR(512),
[DateTime] DATETIME,
[TimeToNextValue] INT,
[SampleCount] INT,
[AverageValue] FLOAT,
[SumAvgValue] FLOAT,
[MinValue] FLOAT,
[MaxMinValue] FLOAT,
[SumMinValue] FLOAT,
[MaxValue] FLOAT,
[MinMaxValue] FLOAT,
[SumMaxValue] FLOAT,
[SumValue] FLOAT,
[StandardDeviation] FLOAT,
[RowType] CHAR(1), -- I - instance values, O - managed entity average, G - series (group) average,
[OptionXml] XML,
[TrendValue_Avg] FLOAT,
[TrendValue_SumAvg] FLOAT,
[TrendValue_Min] FLOAT,
[TrendValue_MaxMin] FLOAT,
[TrendValue_SumMin] FLOAT,
[TrendValue_Max] FLOAT,
[TrendValue_MinMax] FLOAT,
[TrendValue_SumMax] FLOAT,
[TrendValue_Sum] FLOAT,
[StandalonePointInd] TINYINT DEFAULT 0
)

EXEC sp_xml_preparedocument @xmldoc_config OUTPUT, @config

-- get group targets
INSERT INTO #objGr
(ManagedEntityRowId, SeriesGroupNo, [Level])
SELECT
ManagedEntityRowId,
SeriesGroupNo,
0
FROM
OPENXML(@xmldoc_config, '/Data/Values/Value/Object', 2) WITH
(
ManagedEntityRowId INT 'text()',
SeriesGroupNo INT '@mp:parentid',
[Use] NVARCHAR(255) '@Use'
) AS ObjectList
WHERE
ISNULL([Use], 'Self') = 'Containment' OR @SectionMode&lt;&gt;'N'

IF @@ROWCOUNT &gt; 0
BEGIN
DECLARE @ContainmentRelTypeId INT
SELECT
@ContainmentRelTypeId = RelationshipTypeRowId
FROM
[dbo].[vRelationshipType]
WHERE
RelationshipTypeSystemName = 'System.Containment'

-- find all relationship types derived from System.Containment
INSERT INTO #relType
(RelationshipTypeRowId, [Level])
SELECT
RelationshipTypeRowId,
[Level]
FROM
dbo.RelationshipDerivedTypeHierarchy(@ContainmentRelTypeId, 0)

SELECT
@RowCount = @@ROWCOUNT


DECLARE @CurrentLevel INT
SET @CurrentLevel = 1

-- get all managed entities contained in group targets
WHILE (@RowCount &gt; 0)
BEGIN
INSERT INTO #objGr
(ManagedEntityRowId, SeriesGroupNo, [Level])
SELECT
DISTINCT r.TargetManagedEntityRowId,
me.SeriesGroupNo,
@CurrentLevel
FROM
[dbo].[Relationship] r
JOIN [dbo].[RelationshipManagementGroup] rmg ON (r.RelationshipRowId = rmg.RelationshipRowId)
JOIN #relType rt ON (r.RelationshipTypeRowId = rt.RelationshipTypeRowId)
JOIN #objGr me ON (me.ManagedEntityRowId = r.SourceManagedEntityRowId) AND (me.[Level] = @CurrentLevel - 1)
WHERE
(rmg.FromDateTime &lt;= @dtEnd)
AND (ISNULL(rmg.ToDateTime, '99991231') &gt;= @dtStart)

SELECT
@RowCount = @@ROWCOUNT

SET @CurrentLevel = @CurrentLevel + 1
END
END

-- final targets list
INSERT INTO #obj
(ManagedEntityRowId, SeriesGroupNo)
SELECT
ManagedEntityRowId,
SeriesGroupNo
FROM
OPENXML(@xmldoc_config, '/Data/Values/Value/Object', 2) WITH
(
ManagedEntityRowId INT 'text()',
SeriesGroupNo INT '@mp:parentid',
[Use] NVARCHAR(255) '@Use'
) AS ObjectList
WHERE
ISNULL([Use], 'Self') = 'Self' AND @SectionMode='N'
UNION
SELECT
ManagedEntityRowId,
SeriesGroupNo
FROM
#objGr

-- final instance list
IF @SectionMode='N'
BEGIN
-- explicit instance list from config
INSERT INTO #counterInst
(PerformanceRuleInstanceRowId, InstanceName, SeriesGroupNo)
SELECT
pri.PerformanceRuleInstanceRowId,
pri.InstanceName,
i.SeriesGroupNo
FROM
OPENXML(@xmldoc_config, '/Data/Values/Value/Instance', 2) WITH
(
RuleGuid UNIQUEIDENTIFIER '../Rule',
InstanceName NVARCHAR(256) 'text()',
SeriesGroupNo INT '@mp:parentid'
) AS i
INNER JOIN [dbo].[vRule] r ON (r.RuleGuid = i.RuleGuid)
INNER JOIN [dbo].[vPerformanceRuleInstance] pri ON (r.RuleRowId = pri.RuleRowId)
AND pri.InstanceName LIKE ISNULL(i.InstanceName,'%')
UNION ALL
-- all instances (no instance list in config)
SELECT
pri.PerformanceRuleInstanceRowId,
pri.InstanceName,
i.SeriesGroupNo
FROM
OPENXML(@xmldoc_config, '/Data/Values/Value', 2) WITH
(
RuleGuid UNIQUEIDENTIFIER 'Rule',
SeriesGroupNo INT '@mp:id'
) AS i
INNER JOIN [dbo].[vRule] r ON (r.RuleGuid = i.RuleGuid)
INNER JOIN [dbo].[vPerformanceRuleInstance] pri ON (r.RuleRowId = pri.RuleRowId)
WHERE
i.SeriesGroupNo NOT IN (SELECT SeriesGroupNo FROM OPENXML(@xmldoc_config, '/Data/Values/Value/Instance', 2) WITH(SeriesGroupNo INT '@mp:parentid'))
END
ELSE IF @counters IS NOT NULL
BEGIN
EXEC sp_xml_preparedocument @xmldoc_counters OUTPUT, @counters

DECLARE @nwRules TABLE (RuleId INT)

-- recode Rule GUIDs to Veeam rule IDs
INSERT @nwRules (RuleId)
SELECT
pr.PerformanceRuleId
FROM
[dbo].[vRule] vr
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
INNER JOIN
OPENXML(@xmldoc_counters, '/root/Data/Values', 2) WITH
(
RuleGuid UNIQUEIDENTIFIER 'text()'
) AS i ON vr.RuleGuid=i.RuleGuid
INNER JOIN dbo.vPerformanceRule AS vpr ON vr.RuleRowId=vpr.RuleRowId
INNER JOIN
OPENXML(@xmldoc_counters, '/root/Label/Data/Values', 2) WITH
(
ObjectCounterName NVARCHAR(512) 'text()'
) AS i1 ON vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+')'=i1.ObjectCounterName

INSERT INTO #counterInst
(
PerformanceRuleInstanceRowId,
PerformanceRuleRowId,
InstanceName,
SeriesGroupNo
)
SELECT
vpri.PerformanceRuleInstanceRowId, vpri.RuleRowId, vpri.InstanceName, vr.RuleRowId
FROM
[dbo].[vPerformanceRuleInstance] vpri
INNER JOIN [dbo].[vRule] vr ON vr.RuleRowId = vpri.RuleRowId
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
INNER JOIN @nwRules i ON pr.PerformanceRuleId=i.RuleId
INNER JOIN dbo.vPerformanceRule AS vpr ON vr.RuleRowId=vpr.RuleRowId
INNER JOIN
OPENXML(@xmldoc_counters, '/root/Label/Data/Values', 2) WITH
(
ObjectCounterName NVARCHAR(512) 'text()'
) AS i1 ON vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+')'=i1.ObjectCounterName

IF @instances IS NOT NULL
BEGIN
DECLARE @nwInstances TABLE (InstanceName NVARCHAR(256))

INSERT @nwInstances (InstanceName)
SELECT DISTINCT InstanceList.InstanceName.value('.', 'nvarchar(256)')
FROM @instances.nodes('/Data/Values') AS InstanceList(InstanceName)

DELETE FROM #counterInst WHERE InstanceName NOT IN (SELECT InstanceName FROM @nwInstances)
END
END

IF @enableMergeTweek=1
BEGIN
INSERT INTO #counterInst
(
PerformanceRuleInstanceRowId,
InstanceName,
SeriesGroupNo
)
SELECT
pri.PerformanceRuleInstanceRowId,
pri.InstanceName,
ci.SeriesGroupNo
FROM
#counterInst ci
INNER JOIN [dbo].[vPerformanceRuleInstance] prip ON ci.PerformanceRuleInstanceRowId=prip.PerformanceRuleInstanceRowId
INNER JOIN [dbo].[vRule] vr ON prip.RuleRowId=vr.RuleRowId
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prp ON prp.RuleSystemName = vr.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prc ON prc.ParentPerformanceRuleId=prp.PerformanceRuleId
INNER JOIN [dbo].[vRule] vrc ON vrc.RuleSystemName = prc.RuleSystemName
INNER JOIN [dbo].[vPerformanceRuleInstance] pri ON pri.RuleRowId=vrc.RuleRowId AND ci.InstanceName=pri.InstanceName
LEFT OUTER JOIN #counterInst cidup ON ci.SeriesGroupNo=cidup.SeriesGroupNo AND pri.PerformanceRuleInstanceRowId=cidup.PerformanceRuleInstanceRowId
WHERE cidup.PerformanceRuleInstanceRowId IS NULL

INSERT INTO #counterInst
(
PerformanceRuleInstanceRowId,
InstanceName,
SeriesGroupNo
)
SELECT
pri.PerformanceRuleInstanceRowId,
pri.InstanceName,
ci.SeriesGroupNo
FROM
#counterInst ci
INNER JOIN [dbo].[vPerformanceRuleInstance] prip ON ci.PerformanceRuleInstanceRowId=prip.PerformanceRuleInstanceRowId
INNER JOIN [dbo].[vRule] vr ON prip.RuleRowId=vr.RuleRowId
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prp ON prp.RuleSystemName = vr.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prc ON prp.ParentPerformanceRuleId=prc.PerformanceRuleId
INNER JOIN [dbo].[vRule] vrc ON vrc.RuleSystemName = prc.RuleSystemName
INNER JOIN [dbo].[vPerformanceRuleInstance] pri ON pri.RuleRowId=vrc.RuleRowId AND ci.InstanceName=pri.InstanceName
LEFT OUTER JOIN #counterInst cidup ON ci.SeriesGroupNo=cidup.SeriesGroupNo AND pri.PerformanceRuleInstanceRowId=cidup.PerformanceRuleInstanceRowId
WHERE cidup.PerformanceRuleInstanceRowId IS NULL

UPDATE ci
SET
PerformanceRuleRowId = vpri.RuleRowId
FROM
#counterInst ci
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.PerformanceRuleInstanceRowId = ci.PerformanceRuleInstanceRowId

UPDATE ic
SET
ParentPerformanceRuleInstanceRowId = ip.PerformanceRuleInstanceRowId,
ParentPerformanceRuleRowId = ip.PerformanceRuleRowId,
MergeCandidateInd = 1
FROM
#counterInst ip
INNER JOIN [dbo].[vRule] vrp ON ip.PerformanceRuleRowId=vrp.RuleRowId
INNER JOIN [dbo].[vPerformanceRule] vprp ON ip.PerformanceRuleRowId=vprp.RuleRowId
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prp ON prp.RuleSystemName = vrp.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prc ON prc.ParentPerformanceRuleId=prp.PerformanceRuleId
INNER JOIN [dbo].[vRule] vrc ON prc.RuleSystemName=vrc.RuleSystemName
INNER JOIN #counterInst ic ON vrc.RuleRowId=ic.PerformanceRuleRowId AND ic.InstanceName=ip.InstanceName
INNER JOIN [dbo].[vPerformanceRule] vprc ON ic.PerformanceRuleRowId=vprc.RuleRowId AND vprp.ObjectName=vprc.ObjectName AND vprp.CounterName=vprp.CounterName

UPDATE ci
SET
ParentPerformanceRuleInstanceRowId = ci.PerformanceRuleInstanceRowId,
ParentPerformanceRuleRowId = ci.PerformanceRuleRowId,
MergeCandidateInd = 1
FROM #counterInst ci
WHERE ci.PerformanceRuleInstanceRowId IN (SELECT DISTINCT ParentPerformanceRuleInstanceRowId FROM #counterInst WHERE ParentPerformanceRuleInstanceRowId IS NOT NULL)
END

-- raw values. will be combined with configuration data (#section, #chart, #seriesGroup, #obj, #counterInst) later.
-- will be used to generate configuration data for "Linked" modes
IF @DataAgg=1
BEGIN
-- daily aggregation
INSERT INTO #rawValues
(
RuleRowId, PerformanceRuleInstanceRowId, InstanceName, ManagedEntityRowId, RawManagedEntityRowId,
[DateTime], SampleCount, AverageValue, MinValue, MaxValue, StandardDeviation,
TopLevelHostManagedEntityRowId, ParentRuleRowId, ParentPerformanceRuleInstanceRowId, MergeCandidateInd
)
SELECT
r.RuleRowId, pri.PerformanceRuleInstanceRowId, pri.InstanceName, me.ManagedEntityRowId, me.ManagedEntityRowId,
p.[DateTime], p.SampleCount, p.AverageValue, p.MinValue, p.MaxValue, p.StandardDeviation,
me.TopLevelHostManagedEntityRowId, i.ParentPerformanceRuleRowId, i.ParentPerformanceRuleInstanceRowId, i.MergeCandidateInd
FROM
perf.vPerfDaily p
INNER JOIN [dbo].[vPerformanceRuleInstance] pri ON pri.PerformanceRuleInstanceRowId = p.PerformanceRuleInstanceRowId
INNER JOIN [dbo].[vPerformanceRule] pr ON pr.RuleRowId = pri.RuleRowId
INNER JOIN [dbo].[vRule] r ON r.RuleRowId = pr.RuleRowId
INNER JOIN [dbo].[vManagedEntity] me ON me.ManagedEntityRowId = p.ManagedEntityRowId
INNER JOIN (SELECT DISTINCT ci.PerformanceRuleInstanceRowId, ci.InstanceName, ci.ParentPerformanceRuleInstanceRowId, ci.ParentPerformanceRuleRowId, ci.MergeCandidateInd
FROM #counterInst ci) AS i ON i.PerformanceRuleInstanceRowId = pri.PerformanceRuleInstanceRowId
INNER JOIN (SELECT DISTINCT obj.ManagedEntityRowId FROM #obj obj) AS o ON o.ManagedEntityRowId=p.ManagedEntityRowId
WHERE
(p.DateTime &gt;= CONVERT(DATETIME,CONVERT(VARCHAR(8), @dtStart, 112)))
AND (p.DateTime &lt; DATEADD(hour,24,CONVERT(DATETIME,CONVERT(VARCHAR(8), @dtEnd, 112))))
END
ELSE
BEGIN
-- hourly aggregation
INSERT INTO #rawValues
(
RuleRowId, PerformanceRuleInstanceRowId, InstanceName, ManagedEntityRowId, RawManagedEntityRowId,
[DateTime], SampleCount, AverageValue, MinValue, MaxValue, StandardDeviation,
TopLevelHostManagedEntityRowId, ParentRuleRowId, ParentPerformanceRuleInstanceRowId, MergeCandidateInd
)
SELECT
r.RuleRowId, pri.PerformanceRuleInstanceRowId, pri.InstanceName, me.ManagedEntityRowId, me.ManagedEntityRowId,
p.[DateTime], p.SampleCount, p.AverageValue, p.MinValue, p.MaxValue, p.StandardDeviation,
me.TopLevelHostManagedEntityRowId, i.ParentPerformanceRuleRowId, i.ParentPerformanceRuleInstanceRowId, i.MergeCandidateInd
FROM
perf.vPerfHourly p
INNER JOIN [dbo].[vPerformanceRuleInstance] pri ON pri.PerformanceRuleInstanceRowId = p.PerformanceRuleInstanceRowId
INNER JOIN [dbo].[vPerformanceRule] pr ON pr.RuleRowId = pri.RuleRowId
INNER JOIN [dbo].[vRule] r ON r.RuleRowId = pr.RuleRowId
INNER JOIN [dbo].[vManagedEntity] me ON me.ManagedEntityRowId = p.ManagedEntityRowId
INNER JOIN (SELECT DISTINCT ci.PerformanceRuleInstanceRowId, ci.InstanceName, ci.ParentPerformanceRuleInstanceRowId, ci.ParentPerformanceRuleRowId, ci.MergeCandidateInd
FROM #counterInst ci) AS i ON i.PerformanceRuleInstanceRowId = pri.PerformanceRuleInstanceRowId
INNER JOIN (SELECT DISTINCT obj.ManagedEntityRowId FROM #obj obj) AS o ON o.ManagedEntityRowId=p.ManagedEntityRowId
WHERE
(p.DateTime &gt;= DATEADD(hour, DATEPART(hour, @dtStart), convert(varchar(8), @dtStart, 112)))
AND
(p.DateTime &lt; DATEADD(hour, DATEPART(hour, @dtEnd), convert(varchar(8), @dtEnd, 112)))

END

IF EXISTS (SELECT TOP 1 1 FROM #rawValues WHERE MergeCandidateInd=1)
BEGIN
INSERT #rawValues
(
RuleRowId, PerformanceRuleInstanceRowId, InstanceName,
ManagedEntityRowId, [DateTime], SampleCount, AverageValue, MinValue,
MaxValue, StandardDeviation, MergeCandidateInd
)
SELECT
RuleRowId = v.ParentRuleRowId,
PerformanceRuleInstanceRowId = v.ParentPerformanceRuleInstanceRowId,
InstanceName = v.InstanceName,
ManagedEntityRowId = v.TopLevelHostManagedEntityRowId,
[DateTime] = v.[DateTime],
SampleCount = SUM(v.SampleCount),
AverageValue = SUM(v.SampleCount*v.AverageValue)/SUM(v.SampleCount),
MinValue = MIN(v.MinValue),
MaxValue = MAX(v.MaxValue),
StandardDeviation = SQRT(SUM(v.SampleCount*POWER(v.StandardDeviation,2))/SUM(v.SampleCount)),
MergeCandidateInd = 0
FROM
#rawValues v
WHERE MergeCandidateInd=1
GROUP BY
v.ParentRuleRowId,
v.ParentPerformanceRuleInstanceRowId,
v.InstanceName,
v.TopLevelHostManagedEntityRowId,
v.[DateTime]

INSERT INTO #obj
(
ManagedEntityRowId,
SeriesGroupNo
)
SELECT DISTINCT vme.TopLevelHostManagedEntityRowId, o.SeriesGroupNo
FROM
#rawValues rv
INNER JOIN #obj o ON o.ManagedEntityRowId = rv.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = rv.ManagedEntityRowId
WHERE rv.MergeCandidateInd=1

DELETE FROM #rawValues WHERE MergeCandidateInd=1
END

-- parse charts and series info
IF @SectionMode='N'
BEGIN
INSERT INTO #seriesGroup
([Group], GroupTitle, SeriesGroupNo, ChartScale, ChartType, ChartColor, OptionXml)
SELECT
[Group],
GroupTitle,
SeriesGroupNo,
ChartScale,
ChartType,
ChartColor,
OptionXml
FROM
OPENXML(@xmldoc_config, '/Data/Values/Value', 2) WITH
(
[Group] INT '@mp:parentid',
GroupTitle NVARCHAR(255) '../@Title',
SeriesGroupNo INT '@mp:id',
ChartScale FLOAT 'Scale',
ChartType NVARCHAR(255) 'Type',
ChartColor NVARCHAR(255) 'Color',
OptionXml XML '@mp:xmltext'
)

UPDATE c
SET c.ChartNo = z.RowNo
FROM
#seriesGroup c
INNER JOIN
(
SELECT
x.[Group],
RowNo = ROW_NUMBER() OVER (ORDER BY x.[Group])
FROM
(SELECT DISTINCT [Group] FROM #seriesGroup) x
) as z ON z.[Group]=c.[Group]

INSERT INTO #chart (SectionNo, ChartNo, ChartName)
SELECT DISTINCT ChartNo,ChartNo, GroupTitle FROM #seriesGroup

INSERT INTO #section (SectionNo, SectionTitle)
SELECT SectionNo, ChartName FROM #chart
END
ELSE
BEGIN
DECLARE @cfg TABLE
(
GroupName NVARCHAR(512),
GroupId INT,
ObjectName NVARCHAR(512),
ObjectId INT,
RuleRowId INT,
RuleName NVARCHAR(512),
InstanceName NVARCHAR(512),
PerformanceRuleInstanceRowId INT,
MeasurementUnitName NVARCHAR(256),
SectionId INT,
SectionTitle NVARCHAR(MAX),
ChartKey NVARCHAR(MAX),
ChartId INT,
ChartTitle NVARCHAR(MAX),
SeriesGroupKey INT,
SeriesGroupId INT,
ChartScale FLOAT
)

DECLARE @SectionObjectTypeId INT

SELECT @SectionObjectTypeId=vmet.ManagedEntityTypeRowId FROM
[dbo].[Veeam_GRL_Report] r
INNER JOIN [dbo].[vManagedEntityType] vmet ON r.ReportTargetManagementEntityTypeSystemName=vmet.ManagedEntityTypeSystemName
WHERE r.ReportSystemName=@ReportId

INSERT @cfg
(GroupName, GroupId, ObjectName, ObjectId, RuleRowId, RuleName,
InstanceName, PerformanceRuleInstanceRowId, MeasurementUnitName,
SectionId, SectionTitle, ChartKey, ChartTitle, SeriesGroupKey,
ChartScale)
SELECT
DISTINCT
GroupName=/*ISNULL(vmeg.Path,'') + CASE WHEN vmeg.[Path] IS NOT NULL THEN '\' ELSE '' END +*/ vmeg.ManagedEntityDefaultName,
GroupId=g.ManagedEntityRowId,
ObjectName=/*ISNULL(vme.Path,'') + CASE WHEN vme.[Path] IS NOT NULL THEN '\' ELSE '' END +*/ vme.ManagedEntityDefaultName,
ObjectId=vme.ManagedEntityRowId,
vr.RuleRowId,
vr.RuleDefaultName,
rv.InstanceName,
rv.PerformanceRuleInstanceRowId,
mu.MeasurementUnitName,
CASE WHEN @SectionMode='G' THEN g.ManagedEntityRowId
WHEN @SectionMode='O' THEN vmeh.ManagedEntityRowId
WHEN @SectionMode='C' THEN vr.RuleRowId END,
CASE WHEN @SectionMode='G' THEN ISNULL(vmeg.Path,'') + CASE WHEN vmeg.[Path] IS NOT NULL THEN '\' ELSE '' END + vmeg.ManagedEntityDefaultName
WHEN @SectionMode='O' AND vmeh.ManagedEntityTypeRowId=@SectionObjectTypeId THEN ISNULL(vmeh.Path,'') + CASE WHEN vmeh.[Path] IS NOT NULL THEN '\' ELSE '' END + vmeh.ManagedEntityDefaultName +' ('+vmet.ManagedEntityTypeDefaultName+')'
WHEN @SectionMode='O' AND vmeh.ManagedEntityTypeRowId&lt;&gt;@SectionObjectTypeId THEN ISNULL(vmeh.Path,'') + CASE WHEN vmeh.[Path] IS NOT NULL THEN '\' ELSE '' END + vmeh.ManagedEntityDefaultName +' ('+vmet.ManagedEntityTypeDefaultName+')'
WHEN @SectionMode='C' THEN vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+')' END,
CASE WHEN @ChartMode=1 THEN CONVERT(NVARCHAR(256),ROW_NUMBER() OVER(ORDER BY rv.PerformanceRuleInstanceRowId, vme.ManagedEntityRowId)) -- 1 chart per counter instance
WHEN @ChartMode=2 THEN vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+') '+CONVERT(NVARCHAR(MAX),vr.RuleRowId) -- 1 chart per counter
WHEN @ChartMode=3 THEN CONVERT(NVARCHAR(256),mu.MeasurementUnitId) -- 1 chart per measurement unit (all counters with the same MU on the same chart)
WHEN @ChartMode=4 THEN CONVERT(NVARCHAR(256),vme.ManagedEntityRowId)+'-'+CONVERT(VARCHAR(256),mu.MeasurementUnitId) -- 1 chart per measurement unit and target
WHEN @ChartMode=5 THEN CONVERT(NVARCHAR(256),vmeh.ManagedEntityRowId) -- 1 chart per top level host
WHEN @ChartMode=6 THEN CONVERT(NVARCHAR(256),vmeg.ManagedEntityRowId) -- 1 chart per group
WHEN @ChartMode=7 THEN CONVERT(NVARCHAR(256),0) -- 1 chart for everything
END,
CASE WHEN @ChartMode=1 THEN vpr.ObjectName+'\'+vpr.CounterName+'\'+rv.InstanceName+' ('+vr.RuleDefaultName+')' -- 1 chart per counter instance
WHEN @ChartMode=2 THEN vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+')' -- 1 chart per counter
WHEN @ChartMode=3 THEN '' --mu.MeasurementUnitName -- 1 chart per measurement unit (all counters with the same MU on the same chart) - we display MU name as an axes label, so we don't need it as a title
WHEN @ChartMode=4 THEN ISNULL(vme.Path,'') + CASE WHEN vme.[Path] IS NOT NULL THEN '\' ELSE '' END + vme.ManagedEntityDefaultName + ' ('+mu.MeasurementUnitName+')' -- 1 chart per measurement unit and target
WHEN @ChartMode=5 AND vmeh.ManagedEntityTypeRowId=@SectionObjectTypeId THEN ISNULL(vmeh.Path,'') + CASE WHEN vmeh.[Path] IS NOT NULL THEN '\' ELSE '' END + vmeh.ManagedEntityDefaultName +' ('+vmet.ManagedEntityTypeDefaultName+')' -- 1 chart per top level host
WHEN @ChartMode=5 AND vmeh.ManagedEntityTypeRowId&lt;&gt;@SectionObjectTypeId THEN ISNULL(vmeh.Path,'') + CASE WHEN vmeh.[Path] IS NOT NULL THEN '\' ELSE '' END + vmeh.ManagedEntityDefaultName +' ('+vmet.ManagedEntityTypeDefaultName+')' -- 1 chart per top level host
WHEN @ChartMode=6 THEN ISNULL(vmeg.Path,'') + CASE WHEN vmeg.[Path] IS NOT NULL THEN '\' ELSE '' END + vmeg.ManagedEntityDefaultName -- 1 chart per group
END,
vr.RuleRowId,
pr.DefaultScale
FROM
#objGr g
INNER JOIN #obj o ON g.SeriesGroupNo=o.SeriesGroupNo
INNER JOIN #rawValues rv ON o.ManagedEntityRowId=rv.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntity] vmeg ON vmeg.ManagedEntityRowId = g.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntity] vmeh ON vme.TopLevelHostManagedEntityRowId=vmeh.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmeh.ManagedEntityTypeRowId=vmet.ManagedEntityTypeRowId
INNER JOIN [dbo].[vRule] vr ON vr.RuleRowId = rv.RuleRowId
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_MeasurementUnit] mu ON mu.MeasurementUnitId = pr.MeasurementUnitId
WHERE g.[Level]=0

UPDATE @cfg
SET ChartId=x.ChartId
FROM
@cfg c
INNER JOIN
(
SELECT
ChartId=ROW_NUMBER() OVER (ORDER BY SectionId, ChartKey), SectionId, ChartKey
FROM @cfg
GROUP BY SectionId, ChartKey
) AS x ON c.SectionId=x.SectionId AND c.ChartKey=x.ChartKey

UPDATE @cfg
SET SeriesGroupId=x.SeriesGroupId
FROM
@cfg c
INNER JOIN
(
SELECT
SeriesGroupId=ROW_NUMBER() OVER (ORDER BY SectionId, ChartId, SeriesGroupKey), SectionId, ChartId, SeriesGroupKey
FROM @cfg
GROUP BY SectionId, ChartId, SeriesGroupKey
) AS x ON c.SectionId=x.SectionId AND c.ChartId=x.ChartId AND c.SeriesGroupKey=x.SeriesGroupKey

INSERT INTO #section
(
SectionNo,
SectionTitle
)
SELECT DISTINCT
c.SectionId, c.SectionTitle
FROM @cfg c

INSERT INTO #chart
(
SectionNo,
ChartNo,
ChartName
)
SELECT DISTINCT
c.SectionId, c.ChartId, c.ChartTitle
FROM @cfg c

TRUNCATE TABLE #seriesGroup

INSERT INTO #seriesGroup
(
ChartNo,
[Group],
GroupTitle,
SeriesGroupNo,
ChartScale,
ChartType,
ChartColor,
OptionXml
)
SELECT DISTINCT
c.ChartId, c.ChartId, NULL, c.SeriesGroupId, c.ChartScale, CASE WHEN @Histogram&gt;0 THEN 'Column' ELSE 'Line' END, cc.ColorCode, NULL
FROM
@cfg c
LEFT OUTER JOIN [dbo].[Veeam_GRL_ColorCode] cc ON cc.ColorCodeRowId=c.SeriesGroupId%32

TRUNCATE TABLE #obj

INSERT INTO #obj
(
ManagedEntityRowId,
SeriesGroupNo
)
SELECT DISTINCT
c.ObjectId, c.SeriesGroupId
FROM @cfg c

TRUNCATE TABLE #counterInst

INSERT INTO #counterInst
(PerformanceRuleInstanceRowId, InstanceName, SeriesGroupNo)
SELECT DISTINCT
c.PerformanceRuleInstanceRowId, c.InstanceName, c.SeriesGroupId
FROM @cfg c
END

-- remove counter instances that have no data
DELETE FROM #counterInst
WHERE PerformanceRuleInstanceRowId NOT IN (SELECT DISTINCT rv.PerformanceRuleInstanceRowId
FROM #rawValues rv)

-- remove objects that have no data
DELETE FROM #obj
WHERE ManagedEntityRowId NOT IN (SELECT DISTINCT rv.ManagedEntityRowId
FROM #rawValues rv)

-- per-instance, per-object perf data
INSERT INTO #values
(
SectionNo,
SectionTitle,
ChartNo,
ChartTitle,
SeriesGroupNo,
ChartScale,
ChartType,
ChartColor,
ManagementGroupGuid,
ManagementGroupDefaultName,
ManagedEntityTypeDefaultName,
ManagedEntityRowId,
RawManagedEntityRowId,
ManagedEntityGuid,
[Path],
ManagedEntityFullName,
ManagedEntityDefaultName,
RuleRowId,
RuleGuid,
RuleDefaultName,
MultiInstanceInd,
ObjectName,
CounterName,
InstanceName,
ValueNo,
[DateTime],
SampleCount,
AverageValue,
SumAvgValue,
MinValue,
MaxMinValue,
SumMinValue,
MaxValue,
MinMaxValue,
SumMaxValue,
SumValue,
StandardDeviation,
RowType,
OptionXml
)
SELECT
s.SectionNo,
s.SectionTitle,
c.ChartNo,
c.ChartName,
sg.SeriesGroupNo,
sg.ChartScale,
sg.ChartType,
sg.ChartColor,
vmg.ManagementGroupGuid,
vmg.ManagementGroupDefaultName,
vmet.ManagedEntityTypeDefaultName,
vme.ManagedEntityRowId,
v.RawManagedEntityRowId,
vme.ManagedEntityGuid,
vme.[Path],
vme.FullName,
vme.DisplayName,
vr.RuleRowId,
vr.RuleGuid,
vr.RuleDefaultName,
vpr.MultiInstanceInd,
vpr.ObjectName,
vpr.CounterName,
i.InstanceName,
ValueNo = ROW_NUMBER() OVER (PARTITION BY s.SectionNo, c.ChartNo, i.SeriesGroupNo, vme.ManagedEntityRowId, v.PerformanceRuleInstanceRowId ORDER BY v.[DateTime]),
v.[DateTime],
v.SampleCount,
v.AverageValue,
v.AverageValue,
v.MinValue,
v.MinValue,
v.MinValue,
v.MaxValue,
v.MaxValue,
v.MaxValue,
v.AverageValue*v.SampleCount,
v.StandardDeviation,
'I',
'&lt;Value&gt;&lt;Object Use="Self"&gt;'+CONVERT(NVARCHAR(MAX),vme.ManagedEntityRowId)+'&lt;/Object&gt;&lt;Rule&gt;'+CONVERT(NVARCHAR(MAX),vr.RuleGuid)+'&lt;/Rule&gt;&lt;Instance/&gt;&lt;/Value&gt;'
FROM
#section s
INNER JOIN #chart c ON c.SectionNo = s.SectionNo
INNER JOIN #seriesGroup sg ON sg.ChartNo = c.ChartNo
INNER JOIN #counterInst i ON i.SeriesGroupNo = sg.SeriesGroupNo
INNER JOIN #obj o ON o.SeriesGroupNo = sg.SeriesGroupNo
INNER JOIN #rawValues v ON v.PerformanceRuleInstanceRowId = i.PerformanceRuleInstanceRowId AND v.ManagedEntityRowId = o.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = v.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagementGroup] vmg ON vmg.ManagementGroupRowId = vme.ManagementGroupRowId
INNER JOIN [dbo].[vRule] vr ON vr.RuleRowId = v.RuleRowId
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
UNION ALL
-- sections/charts that do not have either a) data or b) objects
SELECT DISTINCT
s.SectionNo,
s.SectionTitle,
c.ChartNo,
c.ChartName,
sg.SeriesGroupNo,
sg.ChartScale,
sg.ChartType,
sg.ChartColor,
vmg.ManagementGroupGuid,
vmg.ManagementGroupDefaultName,
vmet.ManagedEntityTypeDefaultName,
vme.ManagedEntityRowId,
v.RawManagedEntityRowId,
vme.ManagedEntityGuid,
vme.[Path],
vme.FullName,
vme.DisplayName,
vr.RuleRowId,
vr.RuleGuid,
vr.RuleDefaultName,
vpr.MultiInstanceInd,
vpr.ObjectName,
vpr.CounterName,
i.InstanceName,
ValueNo = 1,
v.[DateTime],
v.SampleCount,
v.AverageValue,
v.AverageValue,
v.MinValue,
v.MinValue,
v.MinValue,
v.MaxValue,
v.MaxValue,
v.MaxValue,
v.AverageValue*v.SampleCount,
v.StandardDeviation,
'I',
NULL
FROM
#section s
INNER JOIN #chart c ON c.SectionNo = s.SectionNo
INNER JOIN #seriesGroup sg ON sg.ChartNo = c.ChartNo
LEFT OUTER JOIN #counterInst i ON i.SeriesGroupNo = sg.SeriesGroupNo
LEFT OUTER JOIN #obj o ON o.SeriesGroupNo = sg.SeriesGroupNo
LEFT OUTER JOIN #rawValues v ON v.PerformanceRuleInstanceRowId = i.PerformanceRuleInstanceRowId AND v.ManagedEntityRowId = o.ManagedEntityRowId
LEFT OUTER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = v.ManagedEntityRowId
LEFT OUTER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
LEFT OUTER JOIN [dbo].[vManagementGroup] vmg ON vmg.ManagementGroupRowId = vme.ManagementGroupRowId
LEFT OUTER JOIN [dbo].[vRule] vr ON vr.RuleRowId = v.RuleRowId
LEFT OUTER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
--WHERE c.ChartNo=2
WHERE o.ManagedEntityRowId IS NULL OR i.PerformanceRuleInstanceRowId IS NULL

-- instance name may contain some characters which require conversion
UPDATE #values
SET OptionXml.modify('insert text{sql:column("InstanceName")} as first into (/Value/Instance)[1]')
WHERE OptionXml IS NOT NULL

-- Managed Entity (object) average values
IF @DataMode LIKE '%O%'
BEGIN
INSERT INTO #values
(
SectionNo,
SectionTitle,
ChartNo,
ChartTitle,
SeriesGroupNo,
ChartScale,
ChartType,
ChartColor,
RandomColor,
ManagementGroupGuid,
ManagementGroupDefaultName,
ManagedEntityTypeDefaultName,
[Image],
ManagedEntityRowId,
ManagedEntityGuid,
[Path],
ManagedEntityFullName,
ManagedEntityDefaultName,
RuleRowId,
RuleGuid,
RuleDefaultName,
MultiInstanceInd,
ObjectName,
CounterName,
InstanceName,
ValueNo,
[DateTime],
SampleCount,
AverageValue,
SumAvgValue,
MinValue,
MaxMinValue,
SumMinValue,
MaxValue,
MinMaxValue,
SumMaxValue,
SumValue,
StandardDeviation,
RowType,
OptionXml
)
SELECT
v.SectionNo,
v.SectionTitle,
v.ChartNo,
v.ChartTitle,
v.SeriesGroupNo,
v.ChartScale,
v.ChartType,
v.ChartColor,
v.RandomColor,
v.ManagementGroupGuid,
v.ManagementGroupDefaultName,
v.ManagedEntityTypeDefaultName,
v.[Image],
v.ManagedEntityRowId,
v.ManagedEntityGuid,
v.[Path],
v.ManagedEntityFullName,
v.ManagedEntityDefaultName,
v.RuleRowId,
v.RuleGuid,
v.RuleDefaultName,
v.MultiInstanceInd,
v.ObjectName,
v.CounterName,
NULL,
ROW_NUMBER() OVER (PARTITION BY SectionNo, ChartNo, SeriesGroupNo, ManagedEntityRowId ORDER BY [DateTime]),
[DateTime],
SUM(v.SampleCount),
SUM(v.SampleCount*v.AverageValue)/SUM(v.SampleCount),
SUM(v.AverageValue),
MIN(v.MinValue),
MAX(v.MinValue),
SUM(v.MinValue),
MAX(v.MaxValue),
MIN(v.MaxValue),
SUM(v.MaxValue),
SUM(v.SumValue),
SQRT(SUM(v.SampleCount*POWER(v.StandardDeviation,2))/SUM(v.SampleCount)),
'O',
'&lt;Value&gt;&lt;Object Use="Containment"&gt;'+CONVERT(NVARCHAR(MAX),v.ManagedEntityRowId)+'&lt;/Object&gt;&lt;Rule&gt;'+CONVERT(NVARCHAR(MAX),v.RuleGuid)+'&lt;/Rule&gt;&lt;/Value&gt;'
FROM
#values v
WHERE v.RowType='I' AND v.[DateTime] IS NOT NULL
GROUP BY
v.SectionNo, v.SectionTitle, v.ChartNo, v.ChartTitle,
v.SeriesGroupNo, v.ChartScale, v.ChartType, v.ChartColor,
v.RandomColor, v.ManagementGroupGuid, v.ManagementGroupDefaultName,
v.ManagedEntityTypeDefaultName, v.[Image], v.ManagedEntityRowId,
v.ManagedEntityGuid, v.[Path], v.ManagedEntityFullName,
v.ManagedEntityDefaultName, v.RuleRowId, v.RuleGuid,
v.RuleDefaultName, v.MultiInstanceInd, v.ObjectName, v.CounterName, v.[DateTime]
END

-- Group (chart) average values
IF @DataMode LIKE '%G%'
BEGIN
INSERT INTO #values
(
SectionNo,
SectionTitle,
ChartNo,
ChartTitle,
SeriesGroupNo,
ChartScale,
ChartType,
ChartColor,
RandomColor,
ManagementGroupGuid,
ManagementGroupDefaultName,
RuleRowId,
RuleGuid,
RuleDefaultName,
MultiInstanceInd,
ObjectName,
CounterName,
InstanceName,
ValueNo,
[DateTime],
SampleCount,
AverageValue,
SumAvgValue,
MinValue,
MaxMinValue,
SumMinValue,
MaxValue,
MinMaxValue,
SumMaxValue,
SumValue,
StandardDeviation,
RowType
)
SELECT
v.SectionNo,
v.SectionTitle,
v.ChartNo,
v.ChartTitle,
v.SeriesGroupNo,
v.ChartScale,
v.ChartType,
v.ChartColor,
v.RandomColor,
v.ManagementGroupGuid,
v.ManagementGroupDefaultName,
v.RuleRowId,
v.RuleGuid,
v.RuleDefaultName,
v.MultiInstanceInd,
v.ObjectName,
v.CounterName,
NULL,
ROW_NUMBER() OVER (PARTITION BY v.SectionNo, v.ChartNo, v.SeriesGroupNo ORDER BY [DateTime]),
[DateTime],
SUM(v.SampleCount),
SUM(v.SampleCount*v.AverageValue)/SUM(v.SampleCount),
SUM(v.AverageValue),
MIN(v.MinValue),
MAX(v.MinValue),
SUM(v.MinValue),
MAX(v.MaxValue),
MIN(v.MaxValue),
SUM(v.MaxValue),
SUM(v.SumValue),
SQRT(SUM(v.SampleCount*POWER(v.StandardDeviation,2))/SUM(v.SampleCount)),
'G'
FROM
#values v
WHERE v.RowType='I' AND v.[DateTime] IS NOT NULL
GROUP BY
v.SectionNo, v.SectionTitle, v.ChartNo, v.ChartTitle,
v.SeriesGroupNo, v.ChartScale, v.ChartType, v.ChartColor,
v.RandomColor, v.ManagementGroupGuid, v.ManagementGroupDefaultName,
v.RuleRowId, v.RuleGuid,
v.RuleDefaultName, v.MultiInstanceInd, v.ObjectName, v.CounterName, v.[DateTime]

UPDATE v
SET OptionXml = sg.OptionXml
FROM
#values v
INNER JOIN #seriesGroup sg ON sg.SeriesGroupNo = v.SeriesGroupNo
WHERE v.RowType='G'
END

-- Numerate object-instance pairs within group (chart) scope. Numbering will be used for labeling purposes
-- Set random color
UPDATE #values
SET ObjInstNo = oir.ObjInstNo,
RandomColor = cc.ColorCode
FROM
#values v
INNER JOIN
(
SELECT
oi.*,
ObjInstNo=ROW_NUMBER() OVER (PARTITION BY SectionNo, ChartNo ORDER BY SeriesGroupNo, ManagedEntityDefaultName, RuleRowId, RuleDefaultName, InstanceName)
FROM
(
SELECT DISTINCT SectionNo, ChartNo, SeriesGroupNo, ManagedEntityRowId, ManagedEntityDefaultName, RuleRowId, RuleDefaultName, InstanceName
FROM #values
) oi
) oir ON
v.SectionNo=oir.SectionNo
AND v.ChartNo=oir.ChartNo
AND v.SeriesGroupNo=oir.SeriesGroupNo
AND isnull(v.ManagedEntityRowId,0)=isnull(oir.ManagedEntityRowId,0)
AND isnull(v.InstanceName,'---NULL---')=isnull(oir.InstanceName,'---NULL---')
LEFT OUTER JOIN [dbo].[Veeam_GRL_ColorCode] cc ON cc.ColorCodeRowId=oir.ObjInstNo % 32

CREATE INDEX #ix2 ON #values (ObjInstNo)

-- set labels for first, middle and last values for each series instance
UPDATE #values
SET ValueLabel = CONVERT(NVARCHAR(512),v.ObjInstNo)+' ('+v.RowType+')'
FROM
#values v
INNER JOIN
(
SELECT ObjInstNo, ValueNo=MIN(ValueNo)
FROM #values WHERE #values.[DateTime] IS NOT NULL
GROUP BY ObjInstNo

UNION

SELECT ObjInstNo, ValueNo=MAX(ValueNo)/2
FROM #values WHERE #values.[DateTime] IS NOT NULL
GROUP BY ObjInstNo

UNION

SELECT ObjInstNo, ValueNo=MAX(ValueNo)
FROM #values WHERE #values.[DateTime] IS NOT NULL
GROUP BY ObjInstNo
) x ON v.ObjInstNo=x.ObjInstNo AND v.ValueNo=x.ValueNo

-- gap detection
UPDATE v1
SET TimeToNextValue = CASE WHEN @DataAgg=1 THEN DATEDIFF(day,v1.[DateTime],v2.[DateTime]) ELSE DATEDIFF(hour,v1.[DateTime],v2.[DateTime]) END
FROM
#values v1 INNER JOIN
#values v2 ON v1.ObjInstNo=v2.ObjInstNo AND v1.ChartNo=v2.ChartNo AND v1.ValueNo=v2.ValueNo-1

DECLARE @maxGapCount INT

SELECT @maxGapCount = MAX(TimeToNextValue) FROM #values WHERE TimeToNextValue IS NOT NULL

IF @maxGapCount&gt;1
BEGIN
DECLARE @GapOffsets TABLE (i INT IDENTITY, dummy BIT)

INSERT @GapOffsets (dummy)
SELECT TOP(@maxGapCount) 0 FROM [dbo].[Date] d

-- insert empty points
INSERT #values
(SectionNo, SectionTitle, ChartNo, ChartTitle, SeriesGroupNo,
ChartScale, ChartType, ChartColor, RandomColor, ManagementGroupGuid,
ManagementGroupDefaultName, ManagedEntityTypeDefaultName, [Image],
ManagedEntityRowId, ManagedEntityGuid, [Path], ManagedEntityFullName,
ManagedEntityDefaultName, RuleRowId, RuleGuid, RuleDefaultName,
MeasurementUnitName, AggFunction, MultiInstanceInd, ObjectName,
CounterName, InstanceName, ObjInstNo, ValueNo, ValueLabel, [DateTime],
TimeToNextValue, SampleCount, AverageValue, SumAvgValue, MinValue, MaxMinValue, SumMinValue, MaxValue, MinMaxValue, SumMaxValue,
SumValue, StandardDeviation, RowType)
SELECT
v.SectionNo, v.SectionTitle, v.ChartNo, v.ChartTitle,
v.SeriesGroupNo, v.ChartScale, v.ChartType, v.ChartColor,
v.RandomColor, v.ManagementGroupGuid, v.ManagementGroupDefaultName,
v.ManagedEntityTypeDefaultName, v.[Image], v.ManagedEntityRowId,
v.ManagedEntityGuid, v.[Path], v.ManagedEntityFullName,
v.ManagedEntityDefaultName, v.RuleRowId, v.RuleGuid,
v.RuleDefaultName, v.MeasurementUnitName, v.AggFunction,
v.MultiInstanceInd, v.ObjectName, v.CounterName, v.InstanceName,
v.ObjInstNo, v.ValueNo,
ValueLabel = NULL,
[DateTime] = CASE WHEN @DataAgg=1 THEN DATEADD(DAY,g.i,v.[DateTime]) ELSE DATEADD(hour,g.i,v.[DateTime]) END,
TimeToNextValue = 0,
SampleCount = 0,
AverageValue = 0,
SumAvgValue = 0,
MinValue = 0,
MaxMinValue = 0,
SumMinValue = 0,
MaxValue = 0,
MinMaxValue = 0,
SumMaxValue = 0,
SumValue = 0,
StandardDeviation = 0,
v.RowType
FROM
#values v
INNER JOIN @GapOffsets g ON v.TimeToNextValue&gt;g.i
WHERE v.TimeToNextValue&gt;1

-- renumber
UPDATE v
SET v.ValueNo = X.ValueNo
FROM
#values v
INNER JOIN
(
SELECT
a.RowId,
ValueNo = ROW_NUMBER() OVER ( PARTITION BY a.SectionNo, a.ChartNo, a.SeriesGroupNo, a.ObjInstNo ORDER BY a.[DateTime] )
FROM #values a
) AS X ON v.RowId=X.RowId

END

-- set measurement units and aggregation function
UPDATE v
SET
MeasurementUnitName = mu.MeasurementUnitName,
AggFunction = isnull(pr.DefaultAggregationFunction,'Avg')
FROM
#values v
INNER JOIN [dbo].[vRule] vr ON vr.RuleRowId = v.RuleRowId
LEFT OUTER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
LEFT OUTER JOIN [dbo].[Veeam_GRL_MeasurementUnit] mu ON mu.MeasurementUnitId = pr.MeasurementUnitId

-- set URLs
UPDATE v
SET RuleUrl = vgpr.[URL]
FROM
#values v
INNER JOIN [dbo].[vRule] vr ON vr.RuleRowId = v.RuleRowId
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] vgpr ON vgpr.RuleSystemName = vr.RuleSystemName

-- calculate trends
IF @enableTrendCalc=1
BEGIN
DECLARE @trendCoef TABLE
(
ChartNo INT,
SeriesGroupNo INT,
ObjInstNo INT,
ManagedEntityRowId INT,
RuleRowId INT,
InstanceName NVARCHAR(512),
RowType CHAR(1),
LastValueNo INT,
LastDateTime DATETIME,
Cnt BIGINT,
a_avg FLOAT,
b_avg FLOAT,
stdev_avg FLOAT,
a_sumavg FLOAT,
b_sumavg FLOAT,
stdev_sumavg FLOAT,
a_min FLOAT,
b_min FLOAT,
stdev_min FLOAT,
a_maxmin FLOAT,
b_maxmin FLOAT,
stdev_maxmin FLOAT,
a_summin FLOAT,
b_summin FLOAT,
stdev_summin FLOAT,
a_max FLOAT,
b_max FLOAT,
stdev_max FLOAT,
a_minmax FLOAT,
b_minmax FLOAT,
stdev_minmax FLOAT,
a_summax FLOAT,
b_summax FLOAT,
stdev_summax FLOAT,
a_sum FLOAT,
b_sum FLOAT,
stdev_sum FLOAT
)

;WITH sums
(
ChartNo, SeriesGroupNo, ObjInstNo,
ManagedEntityRowId, RuleRowId, InstanceName,
RowType,
x, x2, x_p2,
y_avg, yx_avg,
y_sumavg, yx_sumavg,
y_min, yx_min,
y_maxmin, yx_maxmin,
y_summin, yx_summin,
y_max, yx_max,
y_minmax, yx_minmax,
y_summax, yx_summax,
y_sum, yx_sum,
lastX, lastDT,
Cnt
)
AS
(
SELECT
v.ChartNo,
v.SeriesGroupNo,
v.ObjInstNo,
v.ManagedEntityRowId, v.RuleRowId, v.InstanceName,
RowType = MIN(v.RowType),
x = SUM(v.ValueNo),
x2 = SUM(POWER(v.ValueNo,2)),
x_p2 = POWER(SUM(v.ValueNo),2),
y_avg = SUM(v.AverageValue),
yx_avg = SUM(v.AverageValue*v.ValueNo),
y_sumavg = SUM(v.SumAvgValue),
yx_sumavg = SUM(v.SumAvgValue*v.ValueNo),
y_min = SUM(v.MinValue),
yx_min = SUM(v.MinValue*v.ValueNo),
y_maxmin = SUM(v.MaxMinValue),
yx_maxmin = SUM(v.MaxMinValue*v.ValueNo),
y_summin = SUM(v.SumMinValue),
yx_summin = SUM(v.SumMinValue*v.ValueNo),
y_max = SUM(v.MaxValue),
yx_max = SUM(v.MaxValue*v.ValueNo),
y_minmax = SUM(v.MinMaxValue),
yx_minmax = SUM(v.MinMaxValue*v.ValueNo),
y_summax = SUM(v.SumMaxValue),
yx_summax = SUM(v.SumMaxValue*v.ValueNo),
y_sum = SUM(v.SumValue),
yx_sum = SUM(v.SumValue*v.ValueNo),
lastX = MAX(v.ValueNo),
lastDT = MAX(v.[DateTime]),
Cnt = COUNT(1)
FROM
#values v
WHERE v.SampleCount&gt;0
GROUP BY
v.ChartNo,
v.SeriesGroupNo,
v.ObjInstNo,
v.ManagedEntityRowId, v.RuleRowId, v.InstanceName
),
slope
(
ChartNo,
SeriesGroupNo,
ObjInstNo,
b_avg,
b_sumavg,
b_min,
b_maxmin,
b_summin,
b_max,
b_minmax,
b_summax,
b_sum
)
AS
(
SELECT
s.ChartNo,
s.SeriesGroupNo,
s.ObjInstNo,
b_avg = (s.Cnt*s.yx_avg-s.x*s.y_avg)/(s.Cnt*s.x2-s.x_p2),
b_sumavg = (s.Cnt*s.yx_sumavg-s.x*s.y_sumavg)/(s.Cnt*s.x2-s.x_p2),
b_min = (s.Cnt*s.yx_min-s.x*s.y_min)/(s.Cnt*s.x2-s.x_p2),
b_maxmin = (s.Cnt*s.yx_maxmin-s.x*s.y_maxmin)/(s.Cnt*s.x2-s.x_p2),
b_summin = (s.Cnt*s.yx_summin-s.x*s.y_summin)/(s.Cnt*s.x2-s.x_p2),
b_max = (s.Cnt*s.yx_max-s.x*s.y_max)/(s.Cnt*s.x2-s.x_p2),
b_minmax = (s.Cnt*s.yx_minmax-s.x*s.y_minmax)/(s.Cnt*s.x2-s.x_p2),
b_summax = (s.Cnt*s.yx_summax-s.x*s.y_summax)/(s.Cnt*s.x2-s.x_p2),
b_sum = (s.Cnt*s.yx_sum-s.x*s.y_sum)/(s.Cnt*s.x2-s.x_p2)
FROM
sums s
WHERE s.Cnt&gt;1
),
intersept
(
ChartNo,
SeriesGroupNo,
ObjInstNo,
a_avg,
a_sumavg,
a_min,
a_maxmin,
a_summin,
a_max,
a_minmax,
a_summax,
a_sum
)
AS
(
SELECT
s.ChartNo,
s.SeriesGroupNo,
s.ObjInstNo,
a_avg = (s.y_avg-p.b_avg*s.x)/s.Cnt,
a_sumavg = (s.y_sumavg-p.b_sumavg*s.x)/s.Cnt,
a_min = (s.y_min-p.b_min*s.x)/s.Cnt,
a_maxmin = (s.y_maxmin-p.b_maxmin*s.x)/s.Cnt,
a_summin = (s.y_summin-p.b_summin*s.x)/s.Cnt,
a_max = (s.y_max-p.b_max*s.x)/s.Cnt,
a_minmax = (s.y_minmax-p.b_minmax*s.x)/s.Cnt,
a_summax = (s.y_summax-p.b_summax*s.x)/s.Cnt,
a_sum = (s.y_sum-p.b_sum*s.x)/s.Cnt
FROM
sums s
INNER JOIN slope p ON s.ChartNo=p.ChartNo AND s.SeriesGroupNo=p.SeriesGroupNo AND s.ObjInstNo=p.ObjInstNo
)
INSERT INTO @trendCoef
(
ChartNo,
SeriesGroupNo,
ObjInstNo,
ManagedEntityRowId,
RuleRowId,
InstanceName,
RowType,
LastValueNo,
LastDateTime,
a_avg,
b_avg,
a_sumavg,
b_sumavg,
a_min,
b_min,
a_maxmin,
b_maxmin,
a_summin,
b_summin,
a_max,
b_max,
a_minmax,
b_minmax,
a_summax,
b_summax,
a_sum,
b_sum
)
SELECT
s.ChartNo,
s.SeriesGroupNo,
s.ObjInstNo,
s.ManagedEntityRowId,
s.RuleRowId,
s.InstanceName,
s.RowType,
s.LastX,
s.LastDT,
i.a_avg,
p.b_avg,
i.a_sumavg,
p.b_sumavg,
i.a_min,
p.b_min,
i.a_maxmin,
p.b_maxmin,
i.a_summin,
p.b_summin,
i.a_max,
p.b_max,
i.a_minmax,
p.b_minmax,
i.a_summax,
p.b_summax,
i.a_sum,
p.b_sum
FROM
intersept i
INNER JOIN slope p ON i.ChartNo=p.ChartNo AND i.SeriesGroupNo=p.SeriesGroupNo AND i.ObjInstNo=p.ObjInstNo
RIGHT OUTER JOIN sums s ON s.ChartNo=p.ChartNo AND s.SeriesGroupNo=p.SeriesGroupNo AND s.ObjInstNo=p.ObjInstNo

UPDATE v
SET
TrendValue_Avg = tc.a_avg+v.ValueNo*tc.b_avg,
TrendValue_SumAvg = tc.a_sumavg+v.ValueNo*tc.b_sumavg,
TrendValue_Min = tc.a_min+v.ValueNo*tc.b_min,
TrendValue_MaxMin = tc.a_maxmin+v.ValueNo*tc.b_maxmin,
TrendValue_SumMin = tc.a_summin+v.ValueNo*tc.b_summin,
TrendValue_Max = tc.a_max+v.ValueNo*tc.b_max,
TrendValue_MinMax = tc.a_minmax+v.ValueNo*tc.b_minmax,
TrendValue_SumMax = tc.a_summax+v.ValueNo*tc.b_summax,
TrendValue_Sum = tc.a_sum+v.ValueNo*tc.b_sum
FROM
#values v
INNER JOIN @trendCoef tc ON tc.ChartNo = v.ChartNo AND tc.SeriesGroupNo = v.SeriesGroupNo AND tc.ObjInstNo = v.ObjInstNo

-- calculate trend deviation estimate (this is NOT a confidence interval yet! t-coef should be applied!)
UPDATE tc
SET
tc.stdev_avg = ISNULL(r2.stdev_avg,0),
tc.stdev_sumavg = ISNULL(r2.stdev_sumavg,0),
tc.stdev_min = ISNULL(r2.stdev_min,0),
tc.stdev_maxmin = ISNULL(r2.stdev_maxmin,0),
tc.stdev_summin = ISNULL(r2.stdev_summin,0),
tc.stdev_max = ISNULL(r2.stdev_max,0),
tc.stdev_minmax = ISNULL(r2.stdev_minmax,0),
tc.stdev_summax = ISNULL(r2.stdev_summax,0),
tc.stdev_sum = ISNULL(r2.stdev_sum,0)
FROM
@trendCoef tc
LEFT OUTER JOIN
(
SELECT
v.ChartNo,
v.SeriesGroupNo,
v.ObjInstNo,

stdev_avg=STDEV(v.AverageValue-v.TrendValue_Avg),
stdev_sumavg=STDEV(v.SumAvgValue-v.TrendValue_SumAvg),
stdev_min=STDEV(v.MinValue-v.TrendValue_Min),
stdev_maxmin=STDEV(v.MaxMinValue-v.TrendValue_MaxMin),
stdev_summin=STDEV(v.SumMinValue-v.TrendValue_SumMin),
stdev_max=STDEV(v.MaxValue-v.TrendValue_Max),
stdev_minmax=STDEV(v.MinMaxValue-v.TrendValue_MinMax),
stdev_summax=STDEV(v.SumMaxValue-v.TrendValue_SumMax),
stdev_sum=STDEV(v.SumValue-v.TrendValue_Sum)
FROM
#values v
WHERE v.SampleCount&gt;0
GROUP BY
v.ChartNo,
v.SeriesGroupNo,
v.ObjInstNo
HAVING COUNT(1)&gt;2
) AS r2 ON tc.ChartNo=r2.ChartNo AND tc.SeriesGroupNo=r2.SeriesGroupNo AND tc.ObjInstNo=r2.ObjInstNo

IF @XmlOutputOnly=1
BEGIN
SET @XmlTrend =
(
SELECT t.*
FROM @trendCoef t
FOR XML RAW('TrendCoef'), ROOT('Trend')
)
END

END

UPDATE vm
SET StandalonePointInd = 1
FROM
#values vl
FULL OUTER JOIN #values vm ON vm.SectionNo = vl.SectionNo
AND vm.ChartNo = vl.ChartNo
AND vm.SeriesGroupNo = vl.SeriesGroupNo
AND vm.ObjInstNo = vl.ObjInstNo
AND vm.ValueNo-1 = vl.ValueNo
AND isnull(vl.TimeToNextValue,5)&gt;0
AND isnull(vm.TimeToNextValue,5)&gt;0
WHERE
ISNULL(vl.TimeToNextValue,5)&gt;1 AND ISNULL(vm.TimeToNextValue,5)&gt;1
AND vm.[DateTime] IS NOT NULL

IF @XmlOutputOnly=1
BEGIN
DECLARE @XmlVal XML

SET @XmlVal =
(
SELECT SectionNo, ChartNo, SeriesGroupNo, ManagementGroupGuid,
ManagementGroupDefaultName, ManagedEntityTypeDefaultName,
ManagedEntityRowId, ManagedEntityGuid, [Path],
ManagedEntityDefaultName, RuleRowId, RuleGuid,
RuleDefaultName, MeasurementUnitName, AggFunction,
ObjectName, CounterName, InstanceName, ObjInstNo, ValueNo,
[DateTime], SampleCount, AverageValue, SumAvgValue, MinValue, MaxMinValue, SumMinValue, MaxValue, MinMaxValue, SumMaxValue,
SumValue, StandardDeviation, RowType, OptionXml=CAST(OptionXml AS NVARCHAR(MAX)),
TrendValue_Avg, TrendValue_SumAvg, TrendValue_Min, TrendValue_MaxMin, TrendValue_SumMin, TrendValue_Max, TrendValue_MinMax, TrendValue_SumMax,
TrendValue_Sum, StandalonePointInd
FROM #values
ORDER BY ChartNo, SeriesGroupNo, ObjInstNo, [DateTime]
FOR XML RAW('PerfPoint'), ROOT('PerfPoints')
)

IF @XmlTrend IS NULL SET @OutputXml=@XmlVal
ELSE SET @OutputXml = (SELECT @XmlVal, @XmlTrend FOR XML PATH(''), ROOT('Performance') )

END
ELSE
BEGIN
SELECT * FROM #values ORDER BY [DateTime]
END


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

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

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

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

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

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

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

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

IF @xmldoc_config IS NOT NULL
EXEC sp_xml_removedocument @xmldoc_config

IF @xmldoc_counters IS NOT NULL
EXEC sp_xml_removedocument @xmldoc_counters

END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#section') IS NOT NULL
DROP TABLE #section

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

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

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

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

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

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

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

IF @xmldoc_config IS NOT NULL
EXEC sp_xml_removedocument @xmldoc_config

IF @xmldoc_counters IS NOT NULL
EXEC sp_xml_removedocument @xmldoc_counters

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_PerformanceGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_PerformanceTopGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceTopGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_PerformanceTopGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_PerformanceTopGet]
@StartDate datetime,
@EndDate datetime,
@ObjectList XML = NULL,
@InstanceList XML = NULL,
@RuleId VARCHAR(128),
@IsLinkedReport BIT = 0,
@SortOrder INT=1, -- &gt;= 0 - top, &lt; 0 - bottom
@TopCount INT,
@SortFunction CHAR(3) = 'AVG', -- avg, sum, min, max
@GroupBy CHAR(2) = 'OI' -- OI - object (entity) and counter instance, O - object (entity), I - counter instance
AS
BEGIN
BEGIN TRY

DECLARE @DataAgg TINYINT
SET @DataAgg = CASE WHEN ABS(DATEDIFF(hour,@StartDate,@EndDate))&lt;25 THEN 0 ELSE 1 END

IF @IsLinkedReport=1
BEGIN
IF EXISTS (SELECT TOP 1 1 FROM [dbo].[vRule] vr INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
WHERE vr.RuleGuid=@RuleId )
BEGIN
SELECT @SortFunction=pr.DefaultAggregationFunction
FROM [dbo].[vRule] vr INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
WHERE vr.RuleGuid=@RuleId
END
END

DECLARE @MeasurementUnit VARCHAR(256)

SELECT
@MeasurementUnit=mu.MeasurementUnitName
FROM
[dbo].[vRule] vr
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_MeasurementUnit] mu ON pr.MeasurementUnitId = mu.MeasurementUnitId
WHERE
vr.RuleGuid=@RuleId

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#rule') IS NOT NULL DROP TABLE #rule
IF OBJECT_ID('tempdb..#inst') IS NOT NULL DROP TABLE #inst

CREATE TABLE #obj
(
ManagedEntityId INT
)

CREATE TABLE #rule
(
RuleRowId INT,
ParentRuleRowId INT
)

CREATE TABLE #inst
(
PerformanceRuleInstanceRowId INT,
RuleRowId INT,
ObjectName NVARCHAR(256),
CounterName NVARCHAR(256),
InstanceName NVARCHAR(256),
ParentRuleRowId INT,
ParentPerformanceRuleInstanceRowId INT
)

CREATE TABLE #values
(
ManagedEntityId INT,
TopLevelHostManagedEntityId INT,
RuleRowId INT,
PerformanceRuleInstanceRowId INT,
ParentPerformanceRuleInstanceRowId INT,
IncludedObjectCount INT DEFAULT 1,
IncludedInstanceCount INT DEFAULT 1,
[TotalSampleCount] INT,
[TotalAverageValue] FLOAT,
[TotalSumValue] FLOAT,
[TotalMinValue] FLOAT,
[TotalMaxValue] FLOAT,
[TotalStandardDeviation] FLOAT,
[SortValue] FLOAT,
OptionXml XML,
CalcStage INT DEFAULT 1 -- 0 - raw values,
-- 1 - rule instances merged (if required), // no more merging
-- 2 - objects/instances merged (if required)
)

SET @SortOrder = CASE WHEN @SortOrder &lt; 0 THEN -1 ELSE 1 END

-- building object list
IF CONVERT(NVARCHAR(MAX),@ObjectList)='' SET @ObjectList=NULL

IF @ObjectList IS NOT NULL
BEGIN
INSERT INTO #obj
(
ManagedEntityId
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate,
@EndDate = @EndDate,
@ObjectList = @ObjectList,
@ForceContainment = @IsLinkedReport
END

-- building rules list // child rules
INSERT #rule (RuleRowId, ParentRuleRowId)
SELECT
vrc.RuleRowId, vr.RuleRowId
FROM
[dbo].[vRule] vr
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prp ON prp.RuleSystemName = vr.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prc ON prp.PerformanceRuleId=prc.ParentPerformanceRuleId
INNER JOIN [dbo].[vRule] vrc ON prc.RuleSystemName=vrc.RuleSystemName
WHERE vr.RuleGuid=@RuleId

-- building rules list // parent rule
INSERT #rule (RuleRowId, ParentRuleRowId)
SELECT
vrc.RuleRowId, vr.RuleRowId
FROM
[dbo].[vRule] vr
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prp ON prp.RuleSystemName = vr.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prc ON prp.PerformanceRuleId=prc.ParentPerformanceRuleId
INNER JOIN [dbo].[vRule] vrc ON prc.RuleSystemName=vrc.RuleSystemName
WHERE vrc.RuleGuid=@RuleId AND vrc.RuleRowId NOT IN (SELECT r.RuleRowId FROM #rule r)

-- building rules list // master rule
INSERT #rule (RuleRowId)
SELECT vr.RuleRowId FROM [dbo].[vRule] vr WHERE vr.RuleGuid=@RuleId AND vr.RuleRowId NOT IN (SELECT r.RuleRowId FROM #rule r)

-- building rules list // parent is parent for itself if there is no parent
UPDATE #rule SET ParentRuleRowId = RuleRowId WHERE ParentRuleRowId IS NULL

-- building rule instance list
IF @InstanceList IS NULL OR convert(nvarchar(max),@InstanceList)=''
BEGIN
INSERT INTO #inst
(PerformanceRuleInstanceRowId, RuleRowId, ObjectName, CounterName, InstanceName, ParentRuleRowId)
SELECT
vpri.PerformanceRuleInstanceRowId, vr.RuleRowId, vpr.ObjectName, vpr.CounterName, vpri.InstanceName, r.ParentRuleRowId
FROM
[dbo].[vPerformanceRuleInstance] vpri
INNER JOIN [dbo].[vRule] vr ON vpri.RuleRowId = vr.RuleRowId
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
INNER JOIN #rule r ON r.RuleRowId = vr.RuleRowId
END
ELSE BEGIN
INSERT INTO #inst
(PerformanceRuleInstanceRowId, RuleRowId, ObjectName, CounterName, InstanceName, ParentRuleRowId)
SELECT
vpri.PerformanceRuleInstanceRowId, vr.RuleRowId, vpr.ObjectName, vpr.CounterName, vpri.InstanceName, r.ParentRuleRowId
FROM
[dbo].[vPerformanceRuleInstance] vpri
INNER JOIN [dbo].[vRule] vr ON vpri.RuleRowId = vr.RuleRowId
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
INNER JOIN @InstanceList.nodes('/Data/Values') AS InstanceList(InstanceName) ON
InstanceList.InstanceName.value('.', 'nvarchar(256)') =
vpri.InstanceName
INNER JOIN #rule r ON r.RuleRowId = vr.RuleRowId
END

-- building rule instance list // set parents
UPDATE ic
SET
ic.ParentPerformanceRuleInstanceRowId = ip.PerformanceRuleInstanceRowId
FROM
#inst ic
INNER JOIN #inst ip ON (ic.ParentRuleRowId=ip.RuleRowId AND ic.InstanceName=ip.InstanceName)

-- building rule instance list // parent is parent for itself if there is no parent
UPDATE #inst SET ParentPerformanceRuleInstanceRowId = PerformanceRuleInstanceRowId WHERE ParentPerformanceRuleInstanceRowId IS NULL

-- raw aggregated values
-- hourly
IF @DataAgg=0
BEGIN
INSERT INTO #values
(
ManagedEntityId,
TopLevelHostManagedEntityId,
PerformanceRuleInstanceRowId,
ParentPerformanceRuleInstanceRowId,
TotalSampleCount,
TotalAverageValue,
TotalSumValue,
TotalMinValue,
TotalMaxValue,
TotalStandardDeviation
)
SELECT
vpd.ManagedEntityRowId,
vme.TopLevelHostManagedEntityRowId,
vpd.PerformanceRuleInstanceRowId,
i.ParentPerformanceRuleInstanceRowId,
SUM(vpd.SampleCount),
SUM(vpd.SampleCount * vpd.AverageValue) / SUM(vpd.SampleCount),
SUM(vpd.SampleCount * vpd.AverageValue),
MIN(vpd.MinValue),
MAX(vpd.MaxValue),
SQRT(SUM(vpd.SampleCount * POWER(vpd.StandardDeviation, 2)) / SUM(vpd.SampleCount))
FROM
perf.vPerfHourly vpd
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = vpd.ManagedEntityRowId
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.PerformanceRuleInstanceRowId = vpd.PerformanceRuleInstanceRowId
INNER JOIN #inst i ON i.PerformanceRuleInstanceRowId = vpri.PerformanceRuleInstanceRowId
LEFT OUTER JOIN #obj o ON (o.ManagedEntityId=vme.ManagedEntityRowId)
WHERE
(o.ManagedEntityId IS NOT NULL OR @ObjectList IS NULL)
AND (vpd.DateTime &gt;= DATEADD(hh, DATEPART(hh, @StartDate), convert(varchar(8), @StartDate, 112)))
AND (vpd.DateTime &lt; DATEADD(hh, DATEPART(hh, @EndDate), convert(varchar(8), @EndDate, 112)))
GROUP BY
vpd.ManagedEntityRowId,
vme.TopLevelHostManagedEntityRowId,
vpd.PerformanceRuleInstanceRowId,
i.ParentPerformanceRuleInstanceRowId
END
ELSE
BEGIN
INSERT INTO #values
(
ManagedEntityId,
TopLevelHostManagedEntityId,
PerformanceRuleInstanceRowId,
ParentPerformanceRuleInstanceRowId,
TotalSampleCount,
TotalAverageValue,
TotalSumValue,
TotalMinValue,
TotalMaxValue,
TotalStandardDeviation
)
SELECT
vpd.ManagedEntityRowId,
vme.TopLevelHostManagedEntityRowId,
vpd.PerformanceRuleInstanceRowId,
i.ParentPerformanceRuleInstanceRowId,
SUM(vpd.SampleCount),
SUM(vpd.SampleCount * vpd.AverageValue) / SUM(vpd.SampleCount),
SUM(vpd.SampleCount * vpd.AverageValue),
MIN(vpd.MinValue),
MAX(vpd.MaxValue),
SQRT(SUM(vpd.SampleCount * POWER(vpd.StandardDeviation, 2)) / SUM(vpd.SampleCount))
FROM
perf.vPerfDaily vpd
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = vpd.ManagedEntityRowId
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.PerformanceRuleInstanceRowId = vpd.PerformanceRuleInstanceRowId
INNER JOIN #inst i ON i.PerformanceRuleInstanceRowId = vpri.PerformanceRuleInstanceRowId
LEFT OUTER JOIN #obj o ON (o.ManagedEntityId=vme.ManagedEntityRowId)
WHERE
(o.ManagedEntityId IS NOT NULL OR @ObjectList IS NULL)
AND (vpd.DateTime &gt;= CONVERT(DATETIME,CONVERT(VARCHAR(8), @StartDate, 112)))
AND (vpd.DateTime &lt; DATEADD(hour,24,CONVERT(DATETIME,CONVERT(VARCHAR(8), @EndDate, 112))))
GROUP BY
vpd.ManagedEntityRowId,
vme.TopLevelHostManagedEntityRowId,
vpd.PerformanceRuleInstanceRowId,
i.ParentPerformanceRuleInstanceRowId
END

---- merge tweak start

-- no more merge tweak

---- merge tweak end

-- Set RuleRowId
UPDATE v
SET RuleRowId = vpri.RuleRowId
FROM
#values v
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.PerformanceRuleInstanceRowId = v.PerformanceRuleInstanceRowId

-- group by object and instance - no aggregation required
IF @GroupBy='OI'
BEGIN
UPDATE #values SET CalcStage = 2 WHERE CalcStage=1
END
-- group by object - reaggregate
ELSE IF @GroupBy='O'
BEGIN
INSERT INTO #values
(
ManagedEntityId,
TopLevelHostManagedEntityId,
RuleRowId,
PerformanceRuleInstanceRowId,
ParentPerformanceRuleInstanceRowId,
TotalSampleCount,
TotalAverageValue,
TotalSumValue,
TotalMinValue,
TotalMaxValue,
TotalStandardDeviation,
IncludedObjectCount,
IncludedInstanceCount,
CalcStage
)
SELECT
v.ManagedEntityId,
v.TopLevelHostManagedEntityId,
v.RuleRowId,
NULL,
NULL,
SUM(v.TotalSampleCount),
SUM(v.TotalSampleCount * v.TotalAverageValue) / SUM(v.TotalSampleCount),
SUM(v.TotalSumValue),
MIN(v.TotalMinValue),
MAX(v.TotalMaxValue),
SQRT(SUM(v.TotalSampleCount * POWER(v.TotalStandardDeviation, 2)) / SUM(v.TotalSampleCount)),
1,
COUNT(1),
2
FROM
#values v
WHERE v.CalcStage=1
GROUP BY
v.ManagedEntityId,
v.TopLevelHostManagedEntityId,
v.RuleRowId
END
-- group by instance - reaggregate
ELSE IF @GroupBy='I'
BEGIN
INSERT INTO #values
(
ManagedEntityId,
TopLevelHostManagedEntityId,
RuleRowId,
PerformanceRuleInstanceRowId,
ParentPerformanceRuleInstanceRowId,
TotalSampleCount,
TotalAverageValue,
TotalSumValue,
TotalMinValue,
TotalMaxValue,
TotalStandardDeviation,
IncludedObjectCount,
IncludedInstanceCount,
CalcStage
)
SELECT
NULL,
NULL,
v.RuleRowId,
v.ParentPerformanceRuleInstanceRowId,
NULL,
SUM(v.TotalSampleCount),
SUM(v.TotalSampleCount * v.TotalAverageValue) / SUM(v.TotalSampleCount),
SUM(v.TotalSumValue),
MIN(v.TotalMinValue),
MAX(v.TotalMaxValue),
SQRT(SUM(v.TotalSampleCount * POWER(v.TotalStandardDeviation, 2)) / SUM(v.TotalSampleCount)),
COUNT(1),
1,
2
FROM
#values v
WHERE v.CalcStage=1
GROUP BY
v.RuleRowId,
v.ParentPerformanceRuleInstanceRowId
END

-- delete prvious stage data
DELETE FROM #values WHERE CalcStage=1

-- set sort value
UPDATE v
SET SortValue = CASE WHEN @SortFunction='SUM' THEN v.TotalSumValue
WHEN @SortFunction='MIN' THEN v.TotalMinValue
WHEN @SortFunction='MAX' THEN v.TotalMaxValue
ELSE v.TotalAverageValue END
FROM #values v

-- combine OptionXml required for drilldowns
UPDATE v
SET OptionXml = '&lt;Value&gt;&lt;Object Use="Self"&gt;'+CONVERT(NVARCHAR(MAX),v.ManagedEntityId)+'&lt;/Object&gt;&lt;Rule&gt;'+@RuleId+'&lt;/Rule&gt;&lt;/Value&gt;'
FROM
#values v
WHERE v.CalcStage=2 AND v.ManagedEntityId IS NOT NULL

UPDATE v
SET OptionXml.modify('insert &lt;Instance&gt;{ sql:column("vpri.InstanceName") }&lt;/Instance&gt; as last into (/Value)[1]')
FROM
#values v
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.PerformanceRuleInstanceRowId = v.PerformanceRuleInstanceRowId
WHERE OptionXml IS NOT NULL AND v.PerformanceRuleInstanceRowId IS NOT NULL

-- final recordset
SELECT TOP ( @TopCount ) WITH TIES
RowNumber = ROW_NUMBER() OVER (ORDER BY v.SortValue*@SortOrder DESC),
vmet.ManagedEntityTypeRowId, vmet.ManagedEntityTypeSystemName, vmet.ManagedEntityTypeDefaultName,
vmeti.[Image],
vme.ManagedEntityRowId, vme.[Path], vme.Name, vme.DisplayName,
vr.RuleRowId, vr.RuleSystemName, vr.RuleDefaultName,
vpr.ObjectName, vpr.CounterName,
vpri.InstanceName,
v.IncludedObjectCount, v.IncludedInstanceCount,
v.TotalSampleCount,
v.TotalAverageValue,
v.TotalSumValue,
TotalMinValue = CASE WHEN @SortFunction='SUM' THEN NULL ELSE v.TotalMinValue END ,
TotalMaxValue = CASE WHEN @SortFunction='SUM' THEN NULL ELSE v.TotalMaxValue END,
v.TotalStandardDeviation,
v.SortValue,
DataAgg=@DataAgg,
SortFunction=@SortFunction,
MeasurementUnitName = @MeasurementUnit,
v.OptionXml
FROM
#values v
INNER JOIN [dbo].[vRule] vr ON vr.RuleRowId = v.RuleRowId
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
LEFT OUTER JOIN [dbo].[vManagedEntity] vme ON v.ManagedEntityId=vme.ManagedEntityRowId
LEFT OUTER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] vmeti ON vmeti.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId AND vmeti.ImageCategory = N'u16x16Icon'
LEFT OUTER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.PerformanceRuleInstanceRowId = v.PerformanceRuleInstanceRowId
WHERE v.CalcStage=2
ORDER BY (v.SortValue*@SortOrder) DESC

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#rule') IS NOT NULL DROP TABLE #rule
IF OBJECT_ID('tempdb..#inst') IS NOT NULL DROP TABLE #inst
END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#rule') IS NOT NULL DROP TABLE #rule
IF OBJECT_ID('tempdb..#inst') IS NOT NULL DROP TABLE #inst

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_PerformanceTopGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_AlertStatsGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_AlertStatsGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_AlertStatsGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_AlertStatsGet]
@MPList XML,
@pStartDate DATETIME,
@pEndDate DATETIME,
@pStartDate2 DATETIME,
@pEndDate2 DATETIME,
@ObjectList XML = NULL,
@ManagedEntityTypeSystemName NVARCHAR(MAX) = NULL
AS
BEGIN

SET NOCOUNT ON

BEGIN TRY
declare @StartDate DATETIME,
@EndDate DATETIME,
@StartDate2 DATETIME,
@EndDate2 DATETIME

select
@StartDate=@pStartDate,
@EndDate=@pEndDate,
@StartDate2=@pStartDate2,
@EndDate2=@pEndDate2

if @EndDate2 is null set @StartDate2 = null

DECLARE @TotalAlerts numeric(10,4)
DECLARE @TotalAlerts2 numeric(10,4)

if object_id('tempdb..#tmpMPList') is not null drop table #tmpMPList
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
if object_id('tempdb..#tmpAlertList') is not null drop table #tmpAlertList
if object_id('tempdb..#tmpAlertsByEnt') is not null drop table #tmpAlertsByEnt
if object_id('tempdb..#tmpTotalsByEnt') is not null drop table #tmpTotalsByEnt
if object_id('tempdb..#tmpTotalsByAlert') is not null drop table #tmpTotalsByAlert

CREATE TABLE #tmpMPList (ManagementPackRowId INT)

CREATE TABLE #obj ( ManagedEntityId INT )

CREATE TABLE #tmpAlertList
(
AlertGuid UNIQUEIDENTIFIER,
AlertPeriod TINYINT,
ManagedEntityRowId INT
)
CREATE TABLE #tmpAlertsByEnt
(
WorkflowRowId int,
IsMonitorWorkflow INT,
AlertName varchar(max),
ManagedEntityRowId int,
RepeatCount int,
RepeatCount2 int,
RowNum int,
MonitorGuid uniqueidentifier,
RuleGuid uniqueidentifier,
ManagementPackRowId int
)

CREATE TABLE #tmpTotalsByEnt
(
ManagedEntityRowId int,
AlertsCount int,
ActivityPct numeric(10,4),
TopTroublemakersRank INT,
AlertsCount2 int,
ActivityPct2 numeric(10,4)
)

CREATE TABLE #tmpTotalsByAlert
(
WorkflowRowId int,
AlertName varchar(max),
ManagementPackRowId int,
MonitorGuid uniqueidentifier,
RuleGuid uniqueidentifier,
TopAlertsRank INT,
AlertsCount int,
ActivityPct numeric(10,4),
AlertsCount2 int,
ActivityPct2 numeric(10,4)
)

INSERT INTO #tmpMPList (ManagementPackRowId)
SELECT ObjectList.ManagementPackRowId.value('.', 'int')
FROM @MPList.nodes('/Data/Values') AS ObjectList(ManagementPackRowId)

DECLARE @o TABLE (id INT)

IF @ManagedEntityTypeSystemName IS NOT NULL AND @ManagedEntityTypeSystemName&lt;&gt;'System.Entity'
BEGIN
DECLARE @METId INT
SELECT @METId=vmet.ManagedEntityTypeRowId FROM [dbo].[vManagedEntityType] vmet WHERE vmet.ManagedEntityTypeSystemName=@ManagedEntityTypeSystemName

INSERT INTO @o
(
id
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate,
@EndDate = @EndDate,
@ObjectList = NULL,
@ManagedEntityTypeFilterRowId=@METId,
@ForceContainment = 1,
@HostedOnly =1

INSERT INTO @o
(
id
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate2,
@EndDate = @EndDate2,
@ObjectList = NULL,
@ManagedEntityTypeFilterRowId=@METId,
@ForceContainment = 1,
@HostedOnly =1

END
ELSE IF @ObjectList IS NOT NULL
BEGIN
INSERT INTO @o
(
id
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate,
@EndDate = @EndDate,
@ObjectList = @ObjectList,
@ForceContainment = 0

INSERT INTO @o
(
id
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate2,
@EndDate = @EndDate2,
@ObjectList = @ObjectList,
@ForceContainment = 0

END

INSERT INTO #obj
(
ManagedEntityId
)
SELECT DISTINCT id FROM @o

INSERT INTO #tmpAlertList ( AlertGuid, AlertPeriod, ManagedEntityRowId )
SELECT DISTINCT
vAlert.AlertGuid,
case when (vAlert.RaisedDateTime &gt;= @StartDate) AND (vAlert.RaisedDateTime &lt; @EndDate) then 1
when (vAlert.RaisedDateTime &gt;= @StartDate2) AND (vAlert.RaisedDateTime &lt; @EndDate2) then 2
else null END,
vAlert.ManagedEntityRowId

FROM
Alert.vAlert vAlert
LEFT OUTER JOIN dbo.vMonitor vMonitor ON (vAlert.WorkflowRowId = vMonitor.MonitorRowId)
AND (vAlert.MonitorAlertInd = 1)
LEFT OUTER JOIN dbo.vRule vRule ON (vAlert.WorkflowRowId = vRule.RuleRowId)
AND (vAlert.MonitorAlertInd = 0)
INNER JOIN dbo.vManagementPack vMP ON (CASE
WHEN vAlert.MonitorAlertInd = 1 THEN vMonitor.ManagementPackRowId
ELSE vRule.ManagementPackRowId
END) = vMP.ManagementPackRowId
INNER JOIN #tmpMPList ON vMP.ManagementPackRowId = #tmpMPList.ManagementPackRowId
WHERE
--Filter by datetime
( (vAlert.RaisedDateTime &gt;= @StartDate) AND (vAlert.RaisedDateTime &lt; @EndDate) ) OR
( (vAlert.RaisedDateTime &gt;= @StartDate2) AND (vAlert.RaisedDateTime &lt; @EndDate2) )

INSERT INTO #tmpAlertList ( AlertGuid, AlertPeriod, ManagedEntityRowId )
SELECT DISTINCT tal.AlertGuid, 2, tal.ManagedEntityRowId
FROM
#tmpAlertList tal
INNER JOIN Alert.vAlert va ON va.AlertGuid = tal.AlertGuid
WHERE
tal.AlertPeriod=1
AND (va.RaisedDateTime &gt;= @StartDate2) AND (va.RaisedDateTime &lt; @EndDate2)

IF @ObjectList IS NOT NULL OR @ManagedEntityTypeSystemName IS NOT NULL
BEGIN
DELETE FROM #tmpAlertList WHERE ManagedEntityRowId NOT IN (SELECT o.ManagedEntityId FROM #obj o)
END

SET @TotalAlerts = (SELECT COUNT(*) FROM #tmpAlertList where AlertPeriod=1)
SET @TotalAlerts2 = (SELECT COUNT(*) FROM #tmpAlertList where AlertPeriod=2)

insert into #tmpAlertsByEnt (WorkflowRowId, IsMonitorWorkflow, AlertName, ManagedEntityRowId, RepeatCount, RepeatCount2, RowNum, MonitorGuid, RuleGuid, ManagementPackRowId)
SELECT
subAlerts.WorkflowRowId,
CAST(subAlerts.MonitorAlertInd AS INT),
subAlerts.AlertName,
subAlerts.ManagedEntityRowId,
SUM(case when #tmpAlertList.AlertPeriod=1 then 1 else 0 end) AS RepeatCount,
SUM(case when #tmpAlertList.AlertPeriod=2 then 1 else 0 end) AS RepeatCount2,
RowNum = DENSE_RANK() OVER(PARTITION BY subAlerts.ManagedEntityRowId ORDER BY COUNT(*) DESC),
vMonitor.MonitorGuid,
vRule.RuleGuid,
vMP.ManagementPackRowId
FROM
Alert.vAlert subAlerts
INNER JOIN #tmpAlertList ON subAlerts.AlertGuid = #tmpAlertList.AlertGuid
LEFT OUTER JOIN dbo.vMonitor vMonitor ON (subAlerts.WorkflowRowId = vMonitor.MonitorRowId) AND (subAlerts.MonitorAlertInd = 1)
LEFT OUTER JOIN dbo.vRule vRule ON (subAlerts.WorkflowRowId = vRule.RuleRowId) AND (subAlerts.MonitorAlertInd = 0)
INNER JOIN dbo.vManagementPack vMP ON (CASE
WHEN subAlerts.MonitorAlertInd = 1 THEN vMonitor.ManagementPackRowId
ELSE vRule.ManagementPackRowId
END) = vMP.ManagementPackRowId
GROUP BY
subAlerts.WorkflowRowId,
subAlerts.MonitorAlertInd,
subAlerts.AlertName,
subAlerts.ManagedEntityRowId,
vMP.ManagementPackRowId,
vMonitor.MonitorGuid,
vRule.RuleGuid

IF @ObjectList IS NOT NULL
BEGIN
DELETE FROM #tmpAlertsByEnt WHERE ManagedEntityRowId NOT IN (SELECT o.ManagedEntityId FROM #obj o)
END

insert into #tmpTotalsByEnt (ManagedEntityRowId, AlertsCount, ActivityPct, AlertsCount2, ActivityPct2)
select
TopLevelHostManagedEntityRowId,
Sum(RepeatCount),
case when ISNULL(@TotalAlerts,0) &lt;&gt; 0 then convert(decimal,Sum(RepeatCount))/@TotalAlerts else 0 end,
Sum(RepeatCount2),
case when ISNULL(@TotalAlerts2,0) &lt;&gt; 0 then convert(decimal,Sum(RepeatCount2))/@TotalAlerts2 else 0 end
from
#tmpAlertsByEnt t inner join
dbo.vManagedEntity me on t.ManagedEntityRowId=me.ManagedEntityRowId
group by TopLevelHostManagedEntityRowId

UPDATE te
SET te.TopTroublemakersRank = tt.TopTroublemakersRank
FROM
#tmpTotalsByEnt te
INNER JOIN
(
SELECT
t.ManagedEntityRowId,
TopTroublemakersRank = ROW_NUMBER() OVER (ORDER BY t.ActivityPct DESC)
FROM
#tmpTotalsByEnt t
) tt ON te.ManagedEntityRowId=tt.ManagedEntityRowId

insert into #tmpTotalsByAlert
(
WorkflowRowId,
AlertName,
ManagementPackRowId,
MonitorGuid,
RuleGuid,
AlertsCount,
ActivityPct,
AlertsCount2,
ActivityPct2
)
select
WorkflowRowId,
AlertName,
ManagementPackRowId,
MonitorGuid,
RuleGuid,
Sum(RepeatCount),
case when ISNULL(@TotalAlerts,0) &lt;&gt; 0 then convert(decimal,Sum(RepeatCount))/@TotalAlerts else 0 end,
Sum(RepeatCount2),
case when ISNULL(@TotalAlerts2,0) &lt;&gt; 0 then convert(decimal,Sum(RepeatCount2))/@TotalAlerts2 else 0 end
from
#tmpAlertsByEnt t
group by
WorkflowRowId,
AlertName,
ManagementPackRowId,
MonitorGuid,
RuleGuid

UPDATE ta
SET ta.TopAlertsRank = x.TopAlertsRank
FROM
#tmpTotalsByAlert ta
INNER JOIN
(
SELECT
t.WorkflowRowId, t.AlertName,
TopAlertsRank = ROW_NUMBER() OVER (ORDER BY t.ActivityPct DESC)
FROM
#tmpTotalsByAlert t
) x ON ta.WorkflowRowId=x.WorkflowRowId AND ta.AlertName=x.AlertName

SELECT
TopManagedEntityRowId = met.ManagedEntityRowId,
TopDisplayName=met.DisplayName,
me.Path,
me.DisplayName,
_vAlert.WorkflowRowId,
_vAlert.IsMonitorWorkflow,
_vAlert.AlertName,
_vAlert.ManagedEntityRowId,
vMP.ManagementPackDefaultName,
vMP.ManagementPackDefaultDescription,
TriggerDeafultName=case when vMonitor.MonitorDefaultName is not null then N'M: '+vMonitor.MonitorDefaultName else N'R: '+vRule.RuleDefaultName end,
TriggerSystemName=case when vMonitor.MonitorSystemName is not null then N'M: '+vMonitor.MonitorSystemName else N'R: '+vRule.RuleSystemName end,
_vAlert.RepeatCount,
AlertsCountEnt=te.AlertsCount,
CASE
WHEN ISNULL(te.AlertsCount,0) &lt;&gt; 0 THEN convert(numeric(10,4),convert(decimal,_vAlert.RepeatCount)/te.AlertsCount)
ELSE 0
END AS ActivityPctEnt,
AlertsCountAlert=ta.AlertsCount,
CASE
WHEN ISNULL(ta.AlertsCount,0) &lt;&gt; 0 THEN convert(numeric(10,4),convert(decimal,_vAlert.RepeatCount)/ta.AlertsCount)
ELSE 0
END AS ActivityPctAlert,
_vAlert.RepeatCount2,
AlertsCountEnt2=te.AlertsCount2,
CASE
WHEN ISNULL(te.AlertsCount2,0) &lt;&gt; 0 THEN convert(numeric(10,4),convert(decimal,_vAlert.RepeatCount2)/te.AlertsCount2)
ELSE 0
END AS ActivityPctEnt2,
AlertsCountAlert2=ta.AlertsCount2,
CASE
WHEN ISNULL(ta.AlertsCount2,0) &lt;&gt; 0 THEN convert(numeric(10,4),convert(decimal,_vAlert.RepeatCount2)/ta.AlertsCount2)
ELSE 0
END AS ActivityPctAlert2,
_vAlert.RowNum,
AlertActivityPct = ta.ActivityPct,
AlertActivityPct2 = ta.ActivityPct2,
EntActivityPct = te.ActivityPct,
EntActivityPct2 = te.ActivityPct2,
vmeti.[Image],
te.TopTroublemakersRank,
ta.TopAlertsRank
FROM
#tmpAlertsByEnt AS _vAlert
LEFT OUTER JOIN dbo.vMonitor vMonitor ON _vAlert.MonitorGuid = vMonitor.MonitorGuid
LEFT OUTER JOIN dbo.vRule vRule ON _vAlert.RuleGuid = vRule.RuleGuid
INNER JOIN dbo.vManagementPack vMP ON _vAlert.ManagementPackRowId = vMP.ManagementPackRowId
inner join [dbo].[vManagedEntity] me on _vAlert.ManagedEntityRowId=me.ManagedEntityRowId
inner join #tmpTotalsByEnt te on me.TopLevelHostManagedEntityRowId = te.ManagedEntityRowId
inner join #tmpTotalsByAlert ta on _vAlert.WorkflowRowId = ta.WorkflowRowId AND _vAlert.AlertName = ta.AlertName
inner join [dbo].[vManagedEntity] met on te.ManagedEntityRowId=met.ManagedEntityRowId
LEFT OUTER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = met.ManagedEntityTypeRowId
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] vmeti ON vmeti.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId AND vmeti.ImageCategory = N'u16x16Icon'

ORDER BY ta.WorkflowRowId

if object_id('tempdb..#tmpMPList') is not null drop table #tmpMPList
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
if object_id('tempdb..#tmpAlertList') is not null drop table #tmpAlertList
if object_id('tempdb..#tmpAlertsByEnt') is not null drop table #tmpAlertsByEnt
if object_id('tempdb..#tmpTotalsByEnt') is not null drop table #tmpTotalsByEnt
if object_id('tempdb..#tmpTotalsByAlert') is not null drop table #tmpTotalsByAlert

END TRY
BEGIN CATCH
if object_id('tempdb..#tmpMPList') is not null drop table #tmpMPList
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
if object_id('tempdb..#tmpAlertList') is not null drop table #tmpAlertList
if object_id('tempdb..#tmpAlertsByEnt') is not null drop table #tmpAlertsByEnt
if object_id('tempdb..#tmpTotalsByEnt') is not null drop table #tmpTotalsByEnt
if object_id('tempdb..#tmpTotalsByAlert') is not null drop table #tmpTotalsByAlert

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_AlertStatsGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_AlertHistoryGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_AlertHistoryGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_AlertHistoryGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_AlertHistoryGet]
@MPList XML,
@pStartDate DATETIME,
@pEndDate DATETIME,
@ObjectList XML,
@SeverityList XML,
@PriorityList XML,
@WorkflowId INT = -1,
@IsMonitorWorkflow INT = -1 ,
@ManagedEntityType NVARCHAR(512)='System.Entity',
@LimitScopeToHostedOnly BIT = 0
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY
if object_id('tempdb..#tmpMPList') is not null drop table #tmpMPList
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj

CREATE TABLE #tmpMPList (ManagementPackRowId INT)

CREATE TABLE #obj (ManagedEntityRowId INT)

INSERT INTO #tmpMPList (ManagementPackRowId)
SELECT ObjectList.ManagementPackRowId.value('.', 'int')
FROM @MPList.nodes('/Data/Values') AS ObjectList(ManagementPackRowId)

DECLARE @ObjXml XML

IF @ManagedEntityType IS NOT NULL AND @ManagedEntityType&lt;&gt;'System.Entity' AND cast(@ObjectList AS NVARCHAR(MAX))='&lt;Data/&gt;'
BEGIN
DECLARE @METId INT
SELECT @METId=vmet.ManagedEntityTypeRowId FROM [dbo].[vManagedEntityType] vmet WHERE vmet.ManagedEntityTypeSystemName=@ManagedEntityType

EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @pStartDate,
@EndDate = @pEndDate,
@ObjectList = NULL,
@ManagedEntityTypeFilterRowId=@METId,
@ForceContainment = 1,
@HostedOnly =1,
@XmlOutputOnly=1,
@OutputXml=@ObjXml OUT
END
ELSE BEGIN
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @pStartDate,
@EndDate = @pEndDate,
@ObjectList = @ObjectList,
@ForceContainment = 0,
@HostedOnly = @LimitScopeToHostedOnly,
@XmlOutputOnly = 1,
@OutputXml = @ObjXml OUT
END

IF @ObjXml IS NOT NULL
BEGIN
INSERT #obj (ManagedEntityRowId)
SELECT
o.n.value('.','int')
FROM
@ObjXml.nodes('/Objects/Object/ManagedEntityRowId') AS o(n)
END

SELECT
va.AlertGuid,
va.AlertName,
va.AlertDescription,
va.WorkflowRowId,
va.MonitorAlertInd,
va.RaisedDateTime,
RaisedDateHour = DATEADD(hh, DATEPART(hh, RaisedDateTime), convert(varchar(8), RaisedDateTime, 112)),
Severity = CASE va.Severity
WHEN 0 THEN 'Information'
WHEN 1 THEN 'Warning'
WHEN 2 THEN 'Critical'
ELSE NULL
END,
Priority = CASE va.Priority
WHEN 0 THEN 'Low'
WHEN 1 THEN 'Medium'
WHEN 2 THEN 'High'
ELSE NULL
END,
va.RepeatCount,

vmet.ManagedEntityTypeDefaultName,
vmeti.[Image],
va.ManagedEntityRowId,
vme.DisplayName,
vme.[Path],

WorkflowName = ISNULL('M: '+vm.MonitorDefaultName,'R: '+vr.RuleDefaultName),

mp.ManagementPackRowId

FROM
alert.vAlert va
INNER JOIN #obj o ON o.ManagedEntityRowId = va.ManagedEntityRowId
INNER JOIN @SeverityList.nodes('/Data/Values') AS s(n) ON va.Severity=s.n.value('.','tinyint')
INNER JOIN @PriorityList.nodes('/Data/Values') AS p(n) ON va.Priority=p.n.value('.','tinyint')
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = va.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
LEFT OUTER JOIN [dbo].[vRule] vr ON vr.RuleRowId=va.WorkflowRowId AND va.MonitorAlertInd=0
LEFT OUTER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId=va.WorkflowRowId AND va.MonitorAlertInd=1
LEFT OUTER JOIN #tmpMPList mp ON mp.ManagementPackRowId=vr.ManagementPackRowId OR mp.ManagementPackRowId=vm.ManagementPackRowId
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] vmeti ON vmeti.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId AND vmeti.ImageCategory = N'u16x16Icon'
WHERE
va.RaisedDateTime BETWEEN @pStartDate AND @pEndDate
AND (va.WorkflowRowId=@WorkflowId OR @WorkflowId=-1)
AND (va.MonitorAlertInd=CAST(@IsMonitorWorkflow AS BIT) OR @IsMonitorWorkflow=-1 )
AND mp.ManagementPackRowId IS NOT NULL

if object_id('tempdb..#tmpMPList') is not null drop table #tmpMPList
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
END TRY
BEGIN CATCH
if object_id('tempdb..#tmpMPList') is not null drop table #tmpMPList
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_AlertHistoryGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_ManagedEntityTypesGetByReport_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ManagedEntityTypesGetByReport')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ManagedEntityTypesGetByReport] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_ManagedEntityTypesGetByReport]
@ReportSystemName NVARCHAR(256)
AS
BEGIN

DECLARE @OptionsXml XML

SELECT @OptionsXml=vgr.Options
FROM [dbo].[Veeam_GRL_Report] vgr
WHERE vgr.ReportSystemName=@ReportSystemName

DECLARE @res TABLE
(
ManagedEntityTypeSystemName NVARCHAR(256),
ManagedEntityTypeDefaultName NVARCHAR(256)
)

INSERT INTO @res
(
ManagedEntityTypeSystemName,
ManagedEntityTypeDefaultName
)
SELECT
vmet.ManagedEntityTypeSystemName,
vmet.ManagedEntityTypeDefaultName
FROM
@OptionsXml.nodes('/ManagedEntityTypes/ManagedEntityType') AS o(t)
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeSystemName=o.t.value('@SystemName','nvarchar(256)')

IF NOT EXISTS (SELECT TOP 1 1 FROM @res)
BEGIN
INSERT INTO @res
(
ManagedEntityTypeSystemName,
ManagedEntityTypeDefaultName
)
SELECT
vmet.ManagedEntityTypeSystemName,
vmet.ManagedEntityTypeDefaultName
FROM
[dbo].[vManagedEntityType] vmet
WHERE vmet.ManagedEntityTypeSystemName='System.Entity'
END

SELECT * FROM @res r

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ManagedEntityTypesGetByReport] TO OpsMgrReader
GO-- ##### Veeam_GRL_ManagedEntityTypesGetByScope_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ManagedEntityTypesGetByScope')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ManagedEntityTypesGetByScope] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_ManagedEntityTypesGetByScope]
@ObjectList XML,
@NoOutput BIT = 0,
@res XML = NULL OUT
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#meType') IS NOT NULL DROP TABLE #meType
IF OBJECT_ID('tempdb..#out') IS NOT NULL DROP TABLE #out

CREATE TABLE #obj
(
ManagedEntityRowId INT
)

CREATE TABLE #meType
(
ManagedEntityTypeRowId INT,
BaseManagedEntityTypeRowId INT
)

CREATE TABLE #out
(
ManagedEntityTypeRowId INT,
SystemName NVARCHAR(512),
NestPath NVARCHAR(MAX),
NestIdPath XML,
DisplayName NVARCHAR(512)
)

INSERT INTO #obj (ManagedEntityRowId)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = null,
@EndDate = null,
@ObjectList = @ObjectList,
@ForceContainment = 0,
@ManagedEntityTypeRowId = null,
@MaxLevel = null,
@XPathType = NULL

DECLARE @rCount int

INSERT #meType (ManagedEntityTypeRowId, BaseManagedEntityTypeRowId)
SELECT DISTINCT
vme.ManagedEntityTypeRowId, tv.BaseManagedEntityTypeRowId
FROM
#obj o
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityTypeManagementPackVersion] tv ON tv.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId

SET @rCount=@@ROWCOUNT

-- we return System.Entity for empty scope
IF @rCount=0
BEGIN
INSERT #meType (ManagedEntityTypeRowId, BaseManagedEntityTypeRowId)
SELECT DISTINCT
vmet.ManagedEntityTypeRowId, vmetmpv.BaseManagedEntityTypeRowId
FROM
[dbo].[vManagedEntityType] vmet
INNER JOIN [dbo].[vManagedEntityTypeManagementPackVersion] vmetmpv ON vmetmpv.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId
WHERE
vmet.ManagedEntityTypeSystemName='System.Entity'

SET @rCount=@@ROWCOUNT
END

WHILE @rCount&gt;0
BEGIN
INSERT #meType (ManagedEntityTypeRowId, BaseManagedEntityTypeRowId)
SELECT DISTINCT tv.ManagedEntityTypeRowId, tv.BaseManagedEntityTypeRowId
FROM
#meType mt
INNER JOIN [dbo].[vManagedEntityTypeManagementPackVersion] tv ON mt.BaseManagedEntityTypeRowId=tv.ManagedEntityTypeRowId
WHERE tv.ManagedEntityTypeRowId NOT IN (SELECT #meType.ManagedEntityTypeRowId FROM #meType)

SET @rCount=@@ROWCOUNT
END;

WITH cte (BaseManagedEntityTypeRowId, ManagedEntityTypeRowId, NestLevel, NestPath, NestIdPath, DisplayName, SystemName)
AS
(
SELECT
mt.BaseManagedEntityTypeRowId,
mt.ManagedEntityTypeRowId,
0,
CONVERT(VARCHAR(MAX),'/'+CONVERT(VARCHAR(64),vmet.ManagedEntityTypeDefaultName)),
CONVERT(VARCHAR(MAX),'&lt;Id&gt;'+CONVERT(VARCHAR(64),vmet.ManagedEntityTypeRowId)+'&lt;/Id&gt;'),
vmet.ManagedEntityTypeDefaultName,
vmet.ManagedEntityTypeSystemName
FROM
#meType mt
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = mt.ManagedEntityTypeRowId
WHERE mt.BaseManagedEntityTypeRowId IS NULL
UNION ALL
SELECT
mt.BaseManagedEntityTypeRowId,
mt.ManagedEntityTypeRowId,
cte.NestLevel+1,
cte.NestPath+'/'+CONVERT(VARCHAR(64),vmet.ManagedEntityTypeDefaultName),
cte.NestIdPath+'&lt;Id&gt;'+CONVERT(VARCHAR(64),vmet.ManagedEntityTypeRowId)+'&lt;/Id&gt;',
vmet.ManagedEntityTypeDefaultName,
vmet.ManagedEntityTypeSystemName
FROM
#meType mt
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = mt.ManagedEntityTypeRowId
INNER JOIN cte cte ON mt.BaseManagedEntityTypeRowId=cte.ManagedEntityTypeRowId

)
INSERT INTO #out
(
ManagedEntityTypeRowId,
SystemName,
NestPath,
NestIdPath,
DisplayName
)
SELECT
t.ManagedEntityTypeRowId,
t.SystemName,
t.NestPath,
NestIdPath=convert(xml,t.NestIdPath),
DisplayName = REPLICATE('-',t.NestLevel)+CASE WHEN t.NestLevel&gt;0 THEN ' ' ELSE '' END+t.DisplayName
FROM cte t
ORDER BY t.NestPath

SET @res = (SELECT o.ManagedEntityTypeRowId, NestIdPath FROM #out o FOR XML RAW('r'))

IF @NoOutput=0
SELECT * FROM #out

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#meType') IS NOT NULL DROP TABLE #meType
IF OBJECT_ID('tempdb..#out') IS NOT NULL DROP TABLE #out
END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#meType') IS NOT NULL DROP TABLE #meType
IF OBJECT_ID('tempdb..#out') IS NOT NULL DROP TABLE #out

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ManagedEntityTypesGetByScope] TO OpsMgrReader
GO-- ##### Veeam_GRL_MonitorsGetByManagedEntityType_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_MonitorsGetByManagedEntityType')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_MonitorsGetByManagedEntityType] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_MonitorsGetByManagedEntityType]
@ManagedEntityTypeSystemName NVARCHAR(512)
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY
IF OBJECT_ID('tempdb..#meType') IS NOT NULL DROP TABLE #meType
IF OBJECT_ID('tempdb..#monitor') IS NOT NULL DROP TABLE #monitor

CREATE TABLE #meType
(
ManagedEntityTypeRowId INT,
BaseManagedEntityTypeRowId INT
)

CREATE TABLE #monitor
(
MonitorRowId INT,
ParentMonitorRowId INT
)

DECLARE @rCount int

INSERT INTO #meType
(
ManagedEntityTypeRowId,
BaseManagedEntityTypeRowId
)
SELECT DISTINCT
tv.ManagedEntityTypeRowId,
tv.BaseManagedEntityTypeRowId
FROM
[dbo].[vManagedEntityTypeManagementPackVersion] tv
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = tv.ManagedEntityTypeRowId
WHERE
vmet.ManagedEntityTypeSystemName=@ManagedEntityTypeSystemName

SET @rCount=@@ROWCOUNT

WHILE @rCount&gt;0
BEGIN
INSERT #meType (ManagedEntityTypeRowId, BaseManagedEntityTypeRowId)
SELECT DISTINCT tv.ManagedEntityTypeRowId, tv.BaseManagedEntityTypeRowId
FROM
#meType mt
INNER JOIN [dbo].[vManagedEntityTypeManagementPackVersion] tv ON mt.BaseManagedEntityTypeRowId=tv.ManagedEntityTypeRowId
WHERE tv.ManagedEntityTypeRowId NOT IN (SELECT #meType.ManagedEntityTypeRowId FROM #meType)

SET @rCount=@@ROWCOUNT
END

SET @rCount=0

INSERT INTO #monitor
(
MonitorRowId,
ParentMonitorRowId
)
SELECT DISTINCT
mv.MonitorRowId, mv.ParentMonitorRowId
FROM
#meType mt
INNER JOIN [dbo].[vMonitorManagementPackVersion] mv ON mt.ManagedEntityTypeRowId=mv.TargetManagedEntityTypeRowId
INNER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId = mv.MonitorRowId

SET @rCount=@@ROWCOUNT

WHILE @rCount&gt;0
BEGIN
INSERT INTO #monitor
(
MonitorRowId,
ParentMonitorRowId
)
SELECT DISTINCT
mv.MonitorRowId, mv.ParentMonitorRowId
FROM
#meType mt
INNER JOIN [dbo].[vMonitorManagementPackVersion] mv ON mt.ManagedEntityTypeRowId=mv.TargetManagedEntityTypeRowId
INNER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId = mv.MonitorRowId
INNER JOIN #monitor m ON vm.MonitorRowId=m.ParentMonitorRowId
WHERE vm.MonitorRowId NOT IN (SELECT #monitor.MonitorRowId FROM #monitor)

SET @rCount=@@ROWCOUNT
END;

WITH cte (MonitorRowId, NestLevel, NestPath, DisplayName, SystemName)
AS
(
SELECT
vm.MonitorRowId,
0,
CONVERT(VARCHAR(MAX),'/'+CONVERT(VARCHAR(64),vm.MonitorDefaultName)),
vm.MonitorDefaultName,
vm.MonitorSystemName
FROM
#monitor m
INNER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId = m.MonitorRowId
WHERE
m.ParentMonitorRowId IS NULL
UNION ALL
SELECT
vm.MonitorRowId,
c.NestLevel+1,
c.NestPath+'/'+CONVERT(VARCHAR(64),vm.MonitorDefaultName),
vm.MonitorDefaultName,
vm.MonitorSystemName
FROM
cte c
INNER JOIN #monitor m ON m.ParentMonitorRowId=c.MonitorRowId
INNER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId = m.MonitorRowId
)
SELECT
c.MonitorRowId,
c.SystemName,
c.NestPath,
DisplayName = REPLICATE('-',c.NestLevel)+CASE WHEN c.NestLevel&gt;0 THEN ' ' ELSE '' END+c.DisplayName
FROM
cte c
ORDER BY c.NestPath

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

END TRY
BEGIN CATCH

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

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_MonitorsGetByManagedEntityType] TO OpsMgrReader
GO-- ##### Veeam_GRL_StateGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_StateGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_StateGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_StateGet]
@pStartDate datetime,
@pEndDate datetime,
@pStartDate2 datetime,
@pEndDate2 datetime,
@ObjectList XML,
@ManagedEntityTypeSystemName NVARCHAR(512),
@MonitorSystemName NVARCHAR(512),
@DataAgg TINYINT, -- 1 = daily, others = hourly
@UnhealthyStateList XML, -- States:
-- 1 - Critical - red
-- 2 - Warning - yellow
-- 4 - Healthy - green
-- 8 - Unmonitored - white
-- 16 - Monitor disabled - silver
-- 32 - Monitoring unavailable - gray
-- 64 - Unplanned maintenance - black
-- 128 - Planned maintenance - blue
@MaxMonitorsLimit INT = 1000,
@NoNestedMonitors BIT = 0,
@NoDetails BIT = 1,
@ManagedEntityMonitorRowId INT = NULL,
@XmlOutputOnly BIT = 0,
@OutputXml XML = NULL OUT
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY
IF OBJECT_ID('tempdb..#objlist') IS NOT NULL DROP TABLE #objlist
IF OBJECT_ID('tempdb..#mType') IS NOT NULL DROP TABLE #mType
IF OBJECT_ID('tempdb..#meMonitor') IS NOT NULL DROP TABLE #meMonitor
IF OBJECT_ID('tempdb..#stateRaw') IS NOT NULL DROP TABLE #stateRaw
IF OBJECT_ID('tempdb..#artificialIntervals') IS NOT NULL DROP TABLE #artificialIntervals
IF OBJECT_ID('tempdb..#artificialIntervalsStepped') IS NOT NULL DROP TABLE #artificialIntervalsStepped

DECLARE
@ManagedEntityTypeRowId INT,
@MonitorRowId INT

SELECT @ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId
FROM [dbo].[vManagedEntityType] vmet WHERE vmet.ManagedEntityTypeSystemName=@ManagedEntityTypeSystemName

SELECT @MonitorRowId = vm.MonitorRowId
FROM [dbo].[vMonitor] vm WHERE vm.MonitorSystemName=@MonitorSystemName

DECLARE
@StartDate datetime,
@EndDate datetime,
@StartDate2 datetime,
@EndDate2 datetime

IF @DataAgg=1
BEGIN
-- daily
SET @StartDate = dateadd(hour,DATEDIFF(hour,GETDATE(),GETUTCDATE()),CONVERT(DATETIME,CONVERT(VARCHAR(8), @pStartDate, 112)))
SET @EndDate = DATEADD(hour,DATEDIFF(hour,GETDATE(),GETUTCDATE()),CONVERT(DATETIME,CONVERT(VARCHAR(8), @pEndDate, 112)))
SET @StartDate2 = dateadd(hour,DATEDIFF(hour,GETDATE(),GETUTCDATE()),CONVERT(DATETIME,CONVERT(VARCHAR(8), @pStartDate2, 112)))
SET @EndDate2 = DATEADD(hour,DATEDIFF(hour,GETDATE(),GETUTCDATE()),CONVERT(DATETIME,CONVERT(VARCHAR(8), @pEndDate2, 112)))
END
ELSE BEGIN
-- hourly
SET @StartDate = DATEADD(hour, DATEPART(hour, @pStartDate), convert(varchar(8), @pStartDate, 112))
SET @EndDate = DATEADD(hour,DATEPART(hour, @pEndDate), CONVERT(DATETIME,CONVERT(VARCHAR(8), @pEndDate, 112)))
SET @StartDate2 = DATEADD(hour, DATEPART(hour, @pStartDate2), convert(varchar(8), @pStartDate2, 112))
SET @EndDate2 = DATEADD(hour,DATEPART(hour, @pEndDate2), CONVERT(DATETIME,CONVERT(VARCHAR(8), @pEndDate2, 112)))
SET @DataAgg=0
END

IF @StartDate&gt;GETUTCDATE() SET @StartDate=GETUTCDATE()
IF @StartDate2&gt;GETUTCDATE() SET @StartDate2=GETUTCDATE()
IF @EndDate&gt;GETUTCDATE() SET @EndDate=GETUTCDATE()
IF @EndDate2&gt;GETUTCDATE() SET @EndDate2=GETUTCDATE()

IF @StartDate2 IS NULL SET @StartDate2=@StartDate
IF @EndDate2 IS NULL SET @EndDate2=@EndDate

DECLARE @mTypeXml XML

CREATE TABLE #objlist
(
ManagedEntityRowId INT,
IntervalMap TINYINT,
DirtyInd BIT DEFAULT 1
)

CREATE TABLE #mType
(
ManagedEntityTypeRowId INT,
ParentManagedEntityTypeRowId INT
)

CREATE TABLE #meMonitor
(
RowId INT IDENTITY PRIMARY KEY,
ParentRowId INT,
[Level] INT,
ParentManagedEntityMonitorRowId INT,
ChildManagedEntityMonitorRowId INT,
ManagedEntityRowId INT,
DependencyMonitorInd BIT,
MonitorTypeName NVARCHAR(MAX),
RelationshipTypeRowId INT,
RelationshipHierarchyXml XML,
SkipInd INT DEFAULT 0,
ChildrenCount INT DEFAULT 0,
HasSkippedChildrenInd INT DEFAULT 0,
MonitorPath VARCHAR(MAX)
)

CREATE INDEX #ix__meMonitor ON #meMonitor (ChildManagedEntityMonitorRowId)

CREATE TABLE #stateRaw
(
RowId INT IDENTITY,
RowType CHAR(1), -- I - raw interval, T - total
IntervalNo BIGINT,
[DateTime] DATETIME,
[DateTimeTo] DATETIME,
ManagedEntityMonitorRowId INT,
ManagedEntityRowId INT,
MonitorRowId INT,
IntervalDurationMilliseconds BIGINT,
InYellowStateMilliseconds BIGINT,
InRedStateMilliseconds BIGINT,
InPlannedMaintenanceMilliseconds BIGINT,
InUnplannedMaintenanceMilliseconds BIGINT,
InDisabledStateMilliseconds BIGINT,
HealthServiceUnavailableMilliseconds BIGINT,
InWhiteStateMilliseconds BIGINT,
InGreenStateMilliseconds BIGINT,
IntervalMap TINYINT,
UptimeMilliseconds BIGINT,
UptimePct FLOAT,
DowntimeMilliseconds BIGINT,
DowntimePct FLOAT,
FEVerified BIT DEFAULT 0,
AType CHAR(1) -- S/E/M
)

CREATE TABLE #artificialIntervals
(
RowId INT,
[DateTime] DATETIME,
DateTimeTo DATETIME,
IntervalDuration BIGINT,
StepsRequired FLOAT,
AType CHAR(1),
hh INT,
NewDateTimeTo DATETIME
)

CREATE TABLE #artificialIntervalsStepped
(
RowId INT,
[DateTime] DATETIME,
DateTimeTo DATETIME
)

-- calculate unhealthy mask
DECLARE @DowntimeMask INT, @UptimeMask INT

SELECT @DowntimeMask=sum(u.n.value('.','int'))
FROM @UnhealthyStateList.nodes('/Data/Values') AS u(n)

SET @UptimeMask = 255 ^ @DowntimeMask

IF EXISTS (
SELECT TOP 1 1 FROM
[dbo].[StandardDatasetAggregationHistory] sdah
INNER JOIN [dbo].[StandardDataset] sd ON sd.DatasetId = sdah.DatasetId
WHERE
sd.SchemaName='State'
AND sdah.AggregationTypeId=20+10*@DataAgg -- 20 - hourly, 30 - daily
AND sdah.FirstAggregationStartDateTime IS NOT NULL
AND sdah.AggregationDateTime BETWEEN @StartDate AND @EndDate
)
AND
(
EXISTS (
SELECT TOP 1 1 FROM
[dbo].[StandardDatasetAggregationHistory] sdah
INNER JOIN [dbo].[StandardDataset] sd ON sd.DatasetId = sdah.DatasetId
WHERE
sd.SchemaName='State'
AND sdah.AggregationTypeId=20+10*@DataAgg -- 20 - hourly, 30 - daily
AND sdah.FirstAggregationStartDateTime IS NOT NULL
AND sdah.AggregationDateTime BETWEEN @StartDate2 AND @EndDate2
)
OR
@pStartDate2 IS NULL
)
BEGIN

-- get objects in scope
-- - interval 1
INSERT INTO #objlist
(
ManagedEntityRowId
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate,
@EndDate = @EndDate,
@ObjectList = @ObjectList,
@ForceContainment = 0

UPDATE #objlist SET IntervalMap = 1 WHERE IntervalMap IS NULL

-- - interval 2
INSERT INTO #objlist
(
ManagedEntityRowId
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate2,
@EndDate = @EndDate2,
@ObjectList = @ObjectList,
@ForceContainment = 0

UPDATE #objlist SET IntervalMap = 2 WHERE IntervalMap IS NULL

--SELECT * FROM #objlist

-- - merge intervals to remove duplicates
INSERT INTO #objlist (ManagedEntityRowId, IntervalMap, DirtyInd)
SELECT
ISNULL(o1.ManagedEntityRowId,o2.ManagedEntityRowId),
ISNULL(o1.IntervalMap,0)|ISNULL(o2.IntervalMap,0),
0
FROM
(SELECT * FROM #objlist WHERE IntervalMap=1) AS o1
FULL OUTER JOIN (SELECT * FROM #objlist WHERE IntervalMap=2) AS o2 ON o2.ManagedEntityRowId = o1.ManagedEntityRowId

DELETE FROM #objlist WHERE DirtyInd=1

-- get management type hierarchy
EXEC [dbo].[Veeam_GRL_ManagedEntityTypesGetByScope]
@ObjectList = @ObjectList, @NoOutput=1, @res=@mTypeXml OUT

INSERT #mType (ManagedEntityTypeRowId, ParentManagedEntityTypeRowId)
SELECT
ManagedEntityTypeRowId=lst.r.value('../../@ManagedEntityTypeRowId','int'),
ParentManagedEntityTypeRowId=lst.r.value('.','int')
FROM
@mTypeXml.nodes('/r/NestIdPath/Id') AS lst(r)

-- filter scope by MT using MT hierarchy
DELETE FROM #objlist
WHERE ManagedEntityRowId NOT IN (
SELECT
o.ManagedEntityRowId
FROM
#objlist o
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
INNER JOIN #mType mt ON mt.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
WHERE mt.ParentManagedEntityTypeRowId=@ManagedEntityTypeRowId
)

DECLARE @rowcount INT,
@totalrowcount INT,
@level INT,
@SkipInd BIT

SET @level=-1
SET @SkipInd=0
SET @rowcount=0
SET @totalrowcount=0

-- iterate through monitor type tree
WHILE @rowcount&gt;0 OR @level=-1
BEGIN
SET @level=@level+1

SET @SkipInd = CASE WHEN @totalrowcount&gt;=@MaxMonitorsLimit OR @NoNestedMonitors=1 THEN 1 ELSE 0 END

IF @level=0
BEGIN
INSERT INTO #meMonitor
(
[Level],
ParentManagedEntityMonitorRowId,
ChildManagedEntityMonitorRowId,
ManagedEntityRowId,
DependencyMonitorInd,
RelationshipTypeRowId,
MonitorTypeName,
SkipInd,
MonitorPath
)
SELECT DISTINCT
@level,
NULL,
vmem.ManagedEntityMonitorRowId,
vmem.ManagedEntityRowId,
vmmpv.DependencyMonitorInd,
vmmpv.RelationshipTypeRowId,
CASE WHEN vmmpv.UnitMonitorInd=1 THEN 'Unit'
WHEN vmmpv.AggregateMonitorInd=1 THEN 'Aggregate'+ISNULL(': '+vmmpv.[Algorithm],'')+ISNULL(' '+vmmpv.AlgorithmParameter,'')
WHEN vmmpv.DependencyMonitorInd=1 THEN 'Dependancy'+ISNULL(' ('+vrt.RelationshipTypeDefaultName+')','')
END,
@SkipInd,
'/'+CONVERT(VARCHAR(MAX),vmem.ManagedEntityRowId)
FROM
[dbo].[vManagedEntityMonitor] vmem
INNER JOIN [dbo].[vMonitorManagementPackVersion] vmmpv ON vmmpv.MonitorRowId = vmem.MonitorRowId
INNER JOIN #objlist o ON o.ManagedEntityRowId = vmem.ManagedEntityRowId
LEFT OUTER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeRowId = vmmpv.RelationshipTypeRowId
WHERE vmem.MonitorRowId=@MonitorRowId
END
ELSE BEGIN
-- child monitors (direct children)
INSERT INTO #meMonitor
(
ParentRowId,
[Level],
ParentManagedEntityMonitorRowId,
ChildManagedEntityMonitorRowId,
ManagedEntityRowId,
DependencyMonitorInd,
RelationshipTypeRowId,
MonitorTypeName,
SkipInd,
MonitorPath
)
SELECT DISTINCT
m_parent.RowId,
@level,
m_parent.ChildManagedEntityMonitorRowId,
vmem_child.ManagedEntityMonitorRowId,
vmem_child.ManagedEntityRowId,
mm_child.DependencyMonitorInd,
mm_child.RelationshipTypeRowId,
CASE WHEN mm_child.UnitMonitorInd=1 THEN 'Unit'
WHEN mm_child.AggregateMonitorInd=1 THEN 'Aggregate'+ISNULL(': '+mm_child.[Algorithm],'')+ISNULL(' '+mm_child.AlgorithmParameter,'')
WHEN mm_child.DependencyMonitorInd=1 THEN 'Dependancy'+ISNULL(' ('+vrt.RelationshipTypeDefaultName+')','')
END,
@SkipInd,
m_parent.MonitorPath+'/'+CONVERT(VARCHAR(MAX),vmem_child.ManagedEntityMonitorRowId)
FROM
#meMonitor m_parent
INNER JOIN [dbo].[vManagedEntityMonitor] vmem_parent ON m_parent.ChildManagedEntityMonitorRowId=vmem_parent.ManagedEntityMonitorRowId
INNER JOIN [dbo].[vMonitorManagementPackVersion] mm_child ON vmem_parent.MonitorRowId=mm_child.ParentMonitorRowId
INNER JOIN [dbo].[vManagedEntityMonitor] vmem_child ON mm_child.MonitorRowId=vmem_child.MonitorRowId AND vmem_child.ManagedEntityRowId=m_parent.ManagedEntityRowId
LEFT OUTER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeRowId = mm_child.RelationshipTypeRowId
WHERE m_parent.[Level]=@level-1;
END

-- child monitors (dependency targets - via relationship)
INSERT INTO #meMonitor
(
ParentRowId,
[Level],
ParentManagedEntityMonitorRowId,
ChildManagedEntityMonitorRowId,
ManagedEntityRowId,
DependencyMonitorInd,
RelationshipTypeRowId,
MonitorTypeName,
SkipInd,
MonitorPath
)
SELECT DISTINCT
m_parent.RowId,
@level,
m_parent.ChildManagedEntityMonitorRowId,
vmem_child.ManagedEntityMonitorRowId,
vmem_child.ManagedEntityRowId,
vmmpv_child.DependencyMonitorInd,
vmmpv_child.RelationshipTypeRowId,
CASE WHEN vmmpv_child.UnitMonitorInd=1 THEN 'Unit'
WHEN vmmpv_child.AggregateMonitorInd=1 THEN 'Aggregate'+ISNULL(': '+vmmpv_child.[Algorithm],'')+ISNULL(' '+vmmpv_child.AlgorithmParameter,'')
WHEN vmmpv_child.DependencyMonitorInd=1 THEN 'Dependancy'+ISNULL(': '+vrt.RelationshipTypeDefaultName,'')
END,
@SkipInd,
m_parent.MonitorPath+'/'+CONVERT(VARCHAR(MAX),vmem_child.ManagedEntityMonitorRowId)
FROM
#meMonitor m_parent
INNER JOIN [dbo].[vManagedEntityMonitor] vmem_parent ON m_parent.ChildManagedEntityMonitorRowId=vmem_parent.ManagedEntityMonitorRowId
INNER JOIN [dbo].[vMonitorManagementPackVersion] vmmpv_parent ON vmmpv_parent.MonitorRowId = vmem_parent.MonitorRowId
INNER JOIN [dbo].[vRelationship] vr ON vr.SourceManagedEntityRowId=m_parent.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityMonitor] vmem_child ON vr.TargetManagedEntityRowId=vmem_child.ManagedEntityRowId AND vmmpv_parent.DependencyMonitorRowId=vmem_child.MonitorRowId
INNER JOIN [dbo].[vMonitorManagementPackVersion] vmmpv_child ON vmem_child.MonitorRowId=vmmpv_child.MonitorRowId
LEFT OUTER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeRowId = vmmpv_child.RelationshipTypeRowId
WHERE
m_parent.[Level]=@level-1
AND m_parent.DependencyMonitorInd=1
AND m_parent.RelationshipHierarchyXml IS NOT NULL
AND vr.RelationshipTypeRowId IN (SELECT lst.id.value('.','int') FROM m_parent.RelationshipHierarchyXml.nodes('/Id') AS lst(id) );

-- calculate relationship hierarchies for dependancy monitors at this level
WITH cte (OriginalRelationshipTypeRowId, RelationshipTypeRowId, ParentRelationshipTypeRowId, [Level], RelationshipPath)
AS
(
SELECT mm.RelationshipTypeRowId, mm.RelationshipTypeRowId, vrtmpv.BaseRelationshipTypeRowId, 0,
CONVERT(VARCHAR(MAX),'&lt;Id&gt;'+CONVERT(VARCHAR(32),mm.RelationshipTypeRowId)+'&lt;/Id&gt;')
FROM
#meMonitor mm
INNER JOIN [dbo].[vRelationshipTypeManagementPackVersion] vrtmpv ON vrtmpv.RelationshipTypeRowId = mm.RelationshipTypeRowId
WHERE
mm.[Level]=@level
UNION ALL
SELECT
t.OriginalRelationshipTypeRowId, vrtmpv.RelationshipTypeRowId, vrtmpv.BaseRelationshipTypeRowId, t.[Level]+1,
'&lt;Id&gt;'+CONVERT(VARCHAR(32),vrtmpv.RelationshipTypeRowId)+'&lt;/Id&gt;'+t.RelationshipPath
FROM
cte t
INNER JOIN [dbo].[vRelationshipTypeManagementPackVersion] vrtmpv ON t.ParentRelationshipTypeRowId=vrtmpv.RelationshipTypeRowId
)
UPDATE mm
SET mm.RelationshipHierarchyXml = CONVERT(XML,t.RelationshipPath)
FROM
(SELECT * FROM cte WHERE ParentRelationshipTypeRowId IS NULL) t
INNER JOIN #meMonitor mm ON mm.RelationshipTypeRowId=t.OriginalRelationshipTypeRowId
WHERE mm.[Level]=@level AND mm.RelationshipTypeRowId IS NOT NULL

-- found something? let's search for children!
SELECT @rowcount=COUNT(1) FROM #meMonitor WHERE [Level]=@level
SET @totalrowcount=@totalrowcount+@rowcount
END;

-- calculate children and HasSkippedChildrenInd
UPDATE #meMonitor SET ChildrenCount = 0 WHERE [Level]=@level-1
SET @level=@level-2

WHILE @level&gt;=0
BEGIN
UPDATE mm
SET
mm.ChildrenCount = x.Cnt,
mm.HasSkippedChildrenInd=x.HasSkippedChildren
FROM
#meMonitor mm
INNER JOIN
(
SELECT
mmp.RowId,
Cnt=COUNT(1)+SUM(mmc.ChildrenCount),
mmp.[Level],
HasSkippedChildren = CASE WHEN
SUM(mmc.SkipInd)&gt;0
-- SUM(mmc.SkipInd)+SUM(mmc.HasSkippedChildrenInd)&gt;0
THEN 1 ELSE 0 END
FROM
#meMonitor mmc
INNER JOIN #meMonitor mmp ON mmp.RowId=mmc.ParentRowId
WHERE mmp.[Level]=@level
GROUP BY mmp.RowId, mmp.[Level]
) x ON mm.RowId=x.RowId

SET @level=@level-1
END

--remove monitors that should be skipped
DELETE FROM #meMonitor WHERE SkipInd=1

IF @ManagedEntityMonitorRowId IS NOT NULL
BEGIN
DELETE FROM #meMonitor WHERE ChildManagedEntityMonitorRowId&lt;&gt;@ManagedEntityMonitorRowId
END

-- get aggregated state data for selected monitors
IF @DataAgg=1 --AND @NoDetails = 0
BEGIN
-- daily w/details
INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds
)
SELECT
'I',
vsdf.[DateTime],
DATEADD(day,1,vsdf.[DateTime]),
vsdf.ManagedEntityMonitorRowId,
vmem.ManagedEntityRowId,
vmem.MonitorRowId,
60 * 1000 * 1440,
isnull(vsdf.InYellowStateMilliseconds,0),
isnull(vsdf.InRedStateMilliseconds,0),
isnull(vsdf.InPlannedMaintenanceMilliseconds,0),
isnull(vsdf.InUnplannedMaintenanceMilliseconds,0),
isnull(vsdf.InDisabledStateMilliseconds,0),
isnull(vsdf.HealthServiceUnavailableMilliseconds,0),
0,
0
FROM
[State].vStateDaily vsdf
INNER JOIN [dbo].[vManagedEntityMonitor] vmem ON vmem.ManagedEntityMonitorRowId = vsdf.ManagedEntityMonitorRowId
INNER JOIN #meMonitor mm ON mm.ChildManagedEntityMonitorRowId=vsdf.ManagedEntityMonitorRowId

WHERE
((vsdf.[DateTime] &gt;= @StartDate)
AND (vsdf.[DateTime] &lt; @EndDate))
OR
((vsdf.[DateTime] &gt;= @StartDate2)
AND (vsdf.[DateTime] &lt; @EndDate2))

END
ELSE BEGIN
-- hourly w/details
INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds
)
SELECT
'I',
vsdf.[DateTime],
DATEADD(hour,1,vsdf.[DateTime]),
vsdf.ManagedEntityMonitorRowId,
vmem.ManagedEntityRowId,
vmem.MonitorRowId,
60 * 1000 * 60,
isnull(vsdf.InYellowStateMilliseconds,0),
isnull(vsdf.InRedStateMilliseconds,0),
isnull(vsdf.InPlannedMaintenanceMilliseconds,0),
isnull(vsdf.InUnplannedMaintenanceMilliseconds,0),
isnull(vsdf.InDisabledStateMilliseconds,0),
isnull(vsdf.HealthServiceUnavailableMilliseconds,0),
0,
0
FROM
[State].vStateHourly vsdf
INNER JOIN [dbo].[vManagedEntityMonitor] vmem ON vmem.ManagedEntityMonitorRowId = vsdf.ManagedEntityMonitorRowId
INNER JOIN #meMonitor mm ON mm.ChildManagedEntityMonitorRowId=vsdf.ManagedEntityMonitorRowId
WHERE
((vsdf.[DateTime] &gt;= @StartDate)
AND (vsdf.[DateTime] &lt; @EndDate))
OR
((vsdf.[DateTime] &gt;= @StartDate2)
AND (vsdf.[DateTime] &lt; @EndDate2))
END

---- missing intervals
-- numerate intervals
UPDATE s
SET s.IntervalNo = x.IntervalNumber
FROM
(
SELECT
sr.RowId,
IntervalNumber = ROW_NUMBER() OVER (PARTITION BY sr.ManagedEntityMonitorRowId ORDER BY sr.[DateTime])
FROM
#stateRaw sr
) AS x
INNER JOIN #stateRaw s ON s.RowId=x.RowId

-- in the middle
INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds,
AType
)
SELECT
'I',
sr1.DateTimeTo,
sr2.[DateTime],
sr1.ManagedEntityMonitorRowId,
sr1.ManagedEntityRowId,
sr1.MonitorRowId,
CAST(DATEDIFF(minute,sr1.DateTimeTo,sr2.[DateTime]) AS BIGINT)*60*1000,
0,
0,
0,
0,
0,
0,
0,
0,
'M'
FROM
#stateRaw sr1
INNER JOIN #stateRaw sr2 ON sr2.ManagedEntityMonitorRowId = sr1.ManagedEntityMonitorRowId
AND sr2.IntervalNo=sr1.IntervalNo+1
WHERE DATEDIFF(minute,sr1.DateTimeTo,sr2.[DateTime])&gt;0

-- at the beginning &amp; end
DECLARE @MinStartDT DATETIME,
@MaxEndDT DATETIME,
@MaxStartDT DATETIME,
@MinEndDT DATETIME,
@tStartDT DATETIME,
@tEndDT DATETIME,
@loopCnt INT

SET @MinStartDT = CASE WHEN @StartDate&lt;@StartDate2 THEN @StartDate ELSE @StartDate2 END
SET @MaxEndDT = CASE WHEN @EndDate&gt;@EndDate2 THEN @EndDate ELSE @EndDate2 END
SET @MaxStartDT = CASE WHEN @StartDate&lt;@StartDate2 THEN @StartDate2 ELSE @StartDate END
SET @MinEndDT = CASE WHEN @EndDate&gt;@EndDate2 THEN @EndDate2 ELSE @EndDate END

SET @loopCnt=0

WHILE @loopCnt&lt;2
BEGIN

IF @loopCnt=0
BEGIN
SET @tStartDT=@MaxStartDT
SET @tEndDT=@MinEndDT
END
ELSE BEGIN
SET @tStartDT=@MinStartDT
SET @tEndDT=@MaxEndDT
END

SET @loopCnt=@loopCnt+1

-- ... beginning
INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds,
AType
)
SELECT
'I',
@tStartDT,
MIN(sr.[DateTime]),
sr.ManagedEntityMonitorRowId,
sr.ManagedEntityRowId,
sr.MonitorRowId,
CAST(DATEDIFF(minute,@tStartDT,MIN(sr.[DateTime])) AS BIGINT)*60*1000,
0,
0,
0,
0,
0,
0,
0,
0,
'S'
FROM
#stateRaw sr
GROUP BY
sr.ManagedEntityMonitorRowId,
sr.ManagedEntityRowId,
sr.MonitorRowId
HAVING
@tStartDT&lt;MIN(sr.[DateTime])

-- ...end
INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds,
AType
)
SELECT
'I',
MAX(sr.DateTimeTo),
@tEndDT,
sr.ManagedEntityMonitorRowId,
sr.ManagedEntityRowId,
sr.MonitorRowId,
CAST(DATEDIFF(minute,MAX(sr.DateTimeTo),@tEndDT) AS BIGINT)*60*1000,
0,
0,
0,
0,
0,
0,
0,
0,
'E'
FROM
#stateRaw sr
GROUP BY
sr.ManagedEntityMonitorRowId,
sr.ManagedEntityRowId,
sr.MonitorRowId
HAVING
MAX(sr.DateTimeTo)&lt;@tEndDT
END

-- some monitors may not have state data at all - lets add big artficial intervals for them!
INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds,
AType
)
SELECT DISTINCT
'I',
@MinStartDT,
@MaxEndDT,
mm.ChildManagedEntityMonitorRowId,
mm.ManagedEntityRowId,
vmem.MonitorRowId,
CAST(DATEDIFF(minute,@MinStartDT,@MaxEndDT) AS BIGINT)*60*1000,
0,
0,
0,
0,
0,
0,
0,
0,
'M'
FROM
#meMonitor mm
INNER JOIN [dbo].[vManagedEntityMonitor] vmem ON mm.ChildManagedEntityMonitorRowId=vmem.ManagedEntityMonitorRowId
WHERE
mm.ChildManagedEntityMonitorRowId NOT IN (SELECT DISTINCT sr.ManagedEntityMonitorRowId
FROM #stateRaw sr)

-- split artificial intervals into daily/hourly subintervals
-- Date &amp; Time
DECLARE @hour TABLE (hh INT)
DECLARE @date TABLE ([date] DATETIME)
DECLARE @datetime TABLE ([DateTime] DATETIME, [Date] DATETIME, [hour] INT)

INSERT INTO @hour
(
hh
)
SELECT TOP 24 (ROW_NUMBER() OVER(ORDER BY DateValue))-1
FROM [dbo].[vDate]

;WITH minmaxdt (MinDt, MaxDt)
AS
(
SELECT MIN(#stateRaw.[DateTime]), MAX(#stateRaw.DateTimeTo) FROM #stateRaw
)
INSERT INTO @date
(
date
)
SELECT
vd.DateValue
FROM
[dbo].[vDate] vd
INNER JOIN minmaxdt m ON vd.DateValue BETWEEN DATEADD(DAY,-1,m.MinDt) AND DATEADD(DAY,1,m.MaxDt)

INSERT INTO @datetime
(
[DateTime],
Date,
hour
)
SELECT
DATEADD(hour, h.hh, d.date),
d.date,
h.hh
FROM
@date d CROSS JOIN @hour h
-- / Date &amp; Time

INSERT INTO #artificialIntervals (RowId, [DateTime], DateTimeTo, IntervalDuration, StepsRequired, AType)
SELECT
sr.RowId, sr.[DateTime], sr.DateTimeTo,sr.IntervalDurationMilliseconds,
sr.IntervalDurationMilliseconds/(1000*60*60*(CASE WHEN @DataAgg=1 THEN 24 ELSE 1 END))-1,
sr.AType
FROM
#stateRaw sr
WHERE
sr.IntervalDurationMilliseconds &gt; 1000*60*60*(CASE WHEN @DataAgg=1 THEN 24 ELSE 1 END)
AND sr.IntervalNo IS NULL

UPDATE #artificialIntervals
SET hh=DATEPART(hour,CASE WHEN AType='S' THEN DateTimeTo ELSE [DateTime] END)

INSERT #artificialIntervalsStepped (RowId, [DateTime], DateTimeTo)
SELECT
ai.RowId,
vdt.[DateTime],
DateTimeTo = CASE WHEN DATEDIFF(minute,vdt.[DateTime],ai.DateTimeTo)&gt;CASE WHEN @DataAgg=1 THEN 24*60 ELSE 1*60 END
THEN DATEADD(hour,CASE WHEN @DataAgg=1 THEN 24 ELSE 1 END,vdt.[DateTime])
ELSE ai.DateTimeTo END
FROM
#artificialIntervals ai
INNER JOIN @datetime vdt ON ai.[DateTime]&lt;vdt.[DateTime] AND vdt.[DateTime]&lt;ai.DateTimeTo AND (vdt.Hour=ai.hh OR @DataAgg=0)
UPDATE x
SET x.NewDateTimeTo = y.MinDateTime
FROM
#artificialIntervals x
INNER JOIN
(
SELECT
a.RowId,
MinDateTime = MIN(a.[DateTime])
FROM
#artificialIntervalsStepped a
INNER JOIN #artificialIntervals ai ON ai.RowId = a.RowId
GROUP BY a.RowId
) y ON x.RowId=y.RowId

UPDATE sr
SET
DateTimeTo = ai.NewDateTimeTo,
IntervalDurationMilliseconds = CAST(DATEDIFF(minute,ai.[DateTime],ai.NewDateTimeTo) AS BIGINT)*60*1000
FROM
#stateRaw sr
INNER JOIN #artificialIntervals ai ON ai.RowId = sr.RowId

INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds,
AType
)
SELECT
sr.RowType,
ai.[DateTime],
ai.DateTimeTo,
sr.ManagedEntityMonitorRowId,
sr.ManagedEntityRowId,
sr.MonitorRowId,
CAST(DATEDIFF(minute,ai.[DateTime],ai.DateTimeTo) AS BIGINT)*60*1000,
0,
0,
0,
0,
0,
0,
0,
0,
sr.AType
FROM
#stateRaw sr
INNER JOIN #artificialIntervalsStepped ai ON ai.RowId = sr.RowId

-- Start/End artificial intervals shouldn't be smaller that 24h/1h depending on data aggregation mode
DELETE FROM #stateRaw
WHERE
AType IN ('S','E')
AND IntervalDurationMilliseconds&lt;((CASE WHEN @DataAgg=1 THEN 24 ELSE 1 END)*60*60*1000)

-- calculate interval maps
UPDATE sr
SET
sr.IntervalMap = CASE WHEN
((sr.[DateTime] &gt;= @StartDate)
AND (sr.[DateTime] &lt; @EndDate))
OR
((sr.[DateTimeTo] &gt; @StartDate)
AND (sr.[DateTimeTo] &lt; @EndDate))
THEN 1 ELSE 0 END |
CASE WHEN
((sr.[DateTime] &gt;= @StartDate2)
AND (sr.[DateTime] &lt; @EndDate2))
OR
((sr.[DateTimeTo] &gt; @StartDate2)
AND (sr.[DateTimeTo] &lt; @EndDate2))
THEN 2
ELSE 0 END
FROM
#stateRaw sr

-- calculate white state for all intervals - either ME or MP should be
-- unavailable = both ME and MP should be available for green state which will be calculated
-- in the next step
DECLARE @StateDSUID UNIQUEIDENTIFIER,
@MaxStateAggDT DATETIME

SELECT @StateDSUID=sd.DatasetId FROM [dbo].[StandardDataset] sd WHERE sd.SchemaName='State'

DECLARE @wState TABLE (InWhiteStateMilliseconds INT,[DateTime] DATETIME,ManagedEntityMonitorRowId INT,ManagedEntityRowId INT,MonitorRowId INT,mem_exists INT, AggregationCount INT)

IF @DataAgg=1
BEGIN
INSERT INTO @wState
(
InWhiteStateMilliseconds,
[DateTime],
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
mem_exists,
AggregationCount
)
SELECT
CASE WHEN mem_exists.ManagedEntityMonitorRowId IS NULL OR
ah.AggregationCount = 0 THEN 60 * 1000 * 1440
- ISNULL(s.InYellowStateMilliseconds, 0)
- ISNULL(s.InRedStateMilliseconds, 0)
- ISNULL(s.InDisabledStateMilliseconds, 0)
- ISNULL(s.InPlannedMaintenanceMilliseconds, 0)
- ISNULL(s.InUnplannedMaintenanceMilliseconds, 0)
- ISNULL(s.HealthServiceUnavailableMilliseconds, 0) ELSE 0 END,

dt.[DateTime] ,
ManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId ,
ManagedEntityRowId = mem.ManagedEntityRowId ,
MonitorRowId = mem.MonitorRowId ,
mem_exists.ManagedEntityMonitorRowId,
ah.AggregationCount
FROM dbo.vDateTime dt
CROSS JOIN dbo.vManagedEntityMonitor mem
INNER JOIN #meMonitor AS vm ON vm.ChildManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId
INNER JOIN #objlist AS o ON o.ManagedEntityRowId = mem.ManagedEntityRowId
LEFT OUTER JOIN [State].[vStateDaily] s ON ((s.[DateTime] &gt;= dt.[DateTime]) AND (s.[DateTime] &lt; DATEADD(day, 1, dt.[DateTime])) AND (s.ManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId))
LEFT OUTER JOIN (
SELECT DISTINCT
mem2.ManagedEntityMonitorRowId,
dt2.[Date],
dt2.[Time]
FROM dbo.vDateTime dt2
CROSS JOIN dbo.vManagedEntityMonitor mem2
INNER JOIN #meMonitor AS vm2 ON vm2.ChildManagedEntityMonitorRowId = mem2.ManagedEntityMonitorRowId
INNER JOIN dbo.vManagedEntity me ON (me.ManagedEntityRowId = mem2.ManagedEntityRowId)
INNER JOIN dbo.vMonitorManagementPackVersion mmpv ON (mmpv.MonitorRowId = mem2.MonitorRowId)
INNER JOIN dbo.vManagementGroupManagementPackVersion mgmpv ON ((mgmpv.ManagementPackVersionRowId = mmpv.ManagementPackVersionRowId) AND
(mgmpv.ManagementGroupRowId = me.ManagementGroupRowId) AND
(dt2.[DateTime] &gt;= mgmpv.InstalledDateTime) AND
(dt2.[DateTime] &lt; ISNULL(mgmpv.DeletedDateTime, '99991231')))
INNER JOIN dbo.vManagedEntityManagementGroup memg ON ((mem2.ManagedEntityRowId = memg.ManagedEntityRowId)
AND (dt2.[DateTime] &gt;= memg.FromDateTime)
AND (dt2.[DateTime] &lt; ISNULL(memg.ToDateTime, '99991231')))
WHERE (dt2.Minute = ABS(DATEDIFF(minute, GETUTCDATE(), GETDATE()) % 60))
and DATEADD(minute, DATEDIFF(minute, GETUTCDATE(), GETDATE()), dt2.[DateTime]) = CONVERT(datetime, CONVERT(char(8), DATEADD(minute, DATEDIFF(minute, GETUTCDATE(), GETDATE()), dt2.[DateTime]), 112), 112)
AND dt2.[DateTime] BETWEEN DATEADD(day,-1,CASE WHEN @pStartDate&gt;ISNULL(@pStartDate2,@pStartDate) THEN ISNULL(@pStartDate2,@pStartDate) ELSE @pStartDate END )
AND DATEADD(day,1,CASE WHEN @pEndDate&gt;ISNULL(@pEndDate2,@pEndDate) THEN @pEndDate ELSE ISNULL(@pEndDate2,@pEndDate) END)
) AS mem_exists ON (mem_exists.ManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId) AND (mem_exists.[Date] = dt.[Date]) AND (mem_exists.[Time] = dt.[Time])
LEFT JOIN dbo.StandardDatasetAggregationHistory (NOLOCK) ah ON ( ah.AggregationDateTime &gt;= dt.[DateTime] AND ah.AggregationDateTime &lt; DATEADD(day, 1, dt.[DateTime]) AND
-- (ah.AggregationDateTime = dt.[DateTime]) AND
(ah.DatasetId = @StateDSUID) AND
(ah.AggregationTypeId = 30))
WHERE (dt.Minute = ABS(DATEDIFF(minute, GETUTCDATE(), GETDATE()) % 60))
AND DATEADD(minute, DATEDIFF(minute, GETUTCDATE(), GETDATE()), dt.[DateTime]) =
CONVERT(datetime, CONVERT(char(8), DATEADD(minute, DATEDIFF(minute, GETUTCDATE(), GETDATE()), dt.[DateTime]), 112), 112)
AND dt.[DateTime] BETWEEN DATEADD(day,-1,CASE WHEN @pStartDate&gt;ISNULL(@pStartDate2,@pStartDate) THEN ISNULL(@pStartDate2,@pStartDate) ELSE @pStartDate END )
AND DATEADD(day,1,CASE WHEN @pEndDate&gt;ISNULL(@pEndDate2,@pEndDate) THEN @pEndDate ELSE ISNULL(@pEndDate2,@pEndDate) END)

END
ELSE
BEGIN

INSERT INTO @wState
(
InWhiteStateMilliseconds,
[DateTime],
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId ,
mem_exists,
AggregationCount
)
SELECT
CASE WHEN mem_exists.ManagedEntityMonitorRowId IS NULL OR
ah.AggregationCount = 0 THEN 60 * 1000 * 60
- ISNULL(s.InYellowStateMilliseconds, 0)
- ISNULL(s.InRedStateMilliseconds, 0)
- ISNULL(s.InDisabledStateMilliseconds, 0)
- ISNULL(s.InPlannedMaintenanceMilliseconds, 0)
- ISNULL(s.InUnplannedMaintenanceMilliseconds, 0)
- ISNULL(s.HealthServiceUnavailableMilliseconds, 0) ELSE 0 END,

dt.[DateTime] ,
ManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId ,
ManagedEntityRowId = mem.ManagedEntityRowId ,
MonitorRowId = mem.MonitorRowId,
mem_exists.ManagedEntityMonitorRowId,
ah.AggregationCount
FROM dbo.vDateTime dt
CROSS JOIN dbo.vManagedEntityMonitor mem
INNER JOIN #meMonitor AS vm ON vm.ChildManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId
INNER JOIN #objlist AS o ON o.ManagedEntityRowId = mem.ManagedEntityRowId
LEFT OUTER JOIN [State].vStateHourly AS s ON ((s.[DateTime] = dt.[DateTime]) AND (s.ManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId))
LEFT OUTER JOIN (
SELECT DISTINCT
mem2.ManagedEntityMonitorRowId,
dt2.[Date],
dt2.[Time]
FROM dbo.vDateTime dt2
CROSS JOIN dbo.vManagedEntityMonitor mem2
INNER JOIN #meMonitor AS vm2 ON vm2.ChildManagedEntityMonitorRowId = mem2.ManagedEntityMonitorRowId
INNER JOIN dbo.vManagedEntity me ON (me.ManagedEntityRowId = mem2.ManagedEntityRowId)
INNER JOIN dbo.vMonitorManagementPackVersion mmpv ON (mmpv.MonitorRowId = mem2.MonitorRowId)
INNER JOIN dbo.vManagementGroupManagementPackVersion mgmpv ON ((mgmpv.ManagementPackVersionRowId = mmpv.ManagementPackVersionRowId) AND
(mgmpv.ManagementGroupRowId = me.ManagementGroupRowId) AND
(dt2.[DateTime] &gt;=mgmpv.InstalledDateTime) AND
(dt2.DateTime&lt;ISNULL(mgmpv.DeletedDateTime, '99991231') ))
INNER JOIN dbo.vManagedEntityManagementGroup memg ON ((mem2.ManagedEntityRowId = memg.ManagedEntityRowId)
AND (dt2.[DateTime] &gt;= memg.FromDateTime) AND (dt2.[DateTime] &lt; ISNULL(memg.ToDateTime, '99991231')))
WHERE (dt2.Minute = 0)
AND dt2.[DateTime] BETWEEN DATEADD(hour,-1,CASE WHEN @pStartDate&gt;ISNULL(@pStartDate2,@pStartDate) THEN ISNULL(@pStartDate2,@pStartDate) ELSE @pStartDate END )
AND DATEADD(hour,1,CASE WHEN @pEndDate&gt;ISNULL(@pEndDate2,@pEndDate) THEN @pEndDate ELSE ISNULL(@pEndDate2,@pEndDate) END)
) AS mem_exists ON (mem_exists.ManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId) AND (mem_exists.[Date] = dt.[Date]) AND (mem_exists.[Time] = dt.[Time])
LEFT OUTER JOIN dbo.StandardDatasetAggregationHistory (NOLOCK) ah ON ((ah.AggregationDateTime = dt.[DateTime]) AND
(ah.DatasetId = @StateDSUID) AND
(ah.AggregationTypeId = 20))
WHERE (dt.Minute = 0)
AND dt.[DateTime] BETWEEN DATEADD(hour,-1,CASE WHEN @pStartDate&gt;ISNULL(@pStartDate2,@pStartDate) THEN ISNULL(@pStartDate2,@pStartDate) ELSE @pStartDate END )
AND DATEADD(hour,1,CASE WHEN @pEndDate&gt;ISNULL(@pEndDate2,@pEndDate) THEN @pEndDate ELSE ISNULL(@pEndDate2,@pEndDate) END)

END
UPDATE sr
SET sr.InWhiteStateMilliseconds= CASE WHEN sr.IntervalDurationMilliseconds &gt;= ws.InWhiteStateMilliseconds THEN ws.InWhiteStateMilliseconds ELSE sr.IntervalDurationMilliseconds END,
sr.FEVerified = 1
FROM #stateRaw sr
INNER JOIN @wState AS ws ON ws.[DateTime] = sr.[DateTime] AND ws.ManagedEntityMonitorRowId = sr.ManagedEntityMonitorRowId AND ws.ManagedEntityRowId = sr.ManagedEntityRowId

-- Calculate Green State
UPDATE #stateRaw
SET InGreenStateMilliseconds = IntervalDurationMilliseconds
- InYellowStateMilliseconds
- InRedStateMilliseconds
- InPlannedMaintenanceMilliseconds
- InUnplannedMaintenanceMilliseconds
- InDisabledStateMilliseconds
- HealthServiceUnavailableMilliseconds
- InWhiteStateMilliseconds


---- Calculate uptime/downtime timeline
-- absolute values
UPDATE sr
SET
UptimeMilliseconds =
sr.InRedStateMilliseconds * (1 &amp; @UptimeMask)/1 +
sr.InYellowStateMilliseconds * (2 &amp; @UptimeMask)/2 +
sr.InGreenStateMilliseconds * (4 &amp; @UptimeMask)/4 +
sr.InWhiteStateMilliseconds * (8 &amp; @UptimeMask)/8 +
sr.InDisabledStateMilliseconds * (16 &amp; @UptimeMask)/16 +
sr.HealthServiceUnavailableMilliseconds * (32 &amp; @UptimeMask)/32 +
sr.InUnplannedMaintenanceMilliseconds * (64 &amp; @UptimeMask)/64 +
sr.InPlannedMaintenanceMilliseconds * (128 &amp; @UptimeMask)/128,
sr.DowntimeMilliseconds =
sr.InRedStateMilliseconds * (1 &amp; @DowntimeMask)/1 +
sr.InYellowStateMilliseconds * (2 &amp; @DowntimeMask)/2 +
sr.InGreenStateMilliseconds * (4 &amp; @DowntimeMask)/4 +
sr.InWhiteStateMilliseconds * (8 &amp; @DowntimeMask)/8 +
sr.InDisabledStateMilliseconds * (16 &amp; @DowntimeMask)/16 +
sr.HealthServiceUnavailableMilliseconds * (32 &amp; @DowntimeMask)/32 +
sr.InUnplannedMaintenanceMilliseconds * (64 &amp; @DowntimeMask)/64 +
sr.InPlannedMaintenanceMilliseconds * (128 &amp; @DowntimeMask)/128
FROM #stateRaw sr

-- relative values
UPDATE sr
SET
sr.UptimePct = CAST(sr.UptimeMilliseconds AS FLOAT)*100/sr.IntervalDurationMilliseconds,
sr.DowntimePct = 100-CAST(sr.UptimeMilliseconds AS FLOAT)*100/sr.IntervalDurationMilliseconds
FROM #stateRaw sr

---- Calculate uptime/downtime per-monitor totals
INSERT INTO #stateRaw
(
RowType,
[DateTime],
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds,
IntervalMap,
UptimeMilliseconds,
UptimePct,
DowntimeMilliseconds,
DowntimePct
)
-- 1st interval
SELECT
'T',
MIN([DateTime]),
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
SUM(IntervalDurationMilliseconds),
SUM(InYellowStateMilliseconds),
SUM(InRedStateMilliseconds),
SUM(InPlannedMaintenanceMilliseconds),
SUM(InUnplannedMaintenanceMilliseconds),
SUM(InDisabledStateMilliseconds),
SUM(HealthServiceUnavailableMilliseconds),
SUM(InWhiteStateMilliseconds),
SUM(InGreenStateMilliseconds),
1,
SUM(UptimeMilliseconds),
CAST(SUM(UptimeMilliseconds) AS FLOAT)*100/SUM(IntervalDurationMilliseconds),
SUM(DowntimeMilliseconds),
100-CAST(SUM(UptimeMilliseconds) AS FLOAT)*100/SUM(IntervalDurationMilliseconds)
FROM
#stateRaw sr
WHERE
sr.IntervalMap&amp;1=1
GROUP BY
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId

UNION ALL

-- 2nd interval
SELECT
'T',
MIN([DateTime]),
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
SUM(IntervalDurationMilliseconds),
SUM(InYellowStateMilliseconds),
SUM(InRedStateMilliseconds),
SUM(InPlannedMaintenanceMilliseconds),
SUM(InUnplannedMaintenanceMilliseconds),
SUM(InDisabledStateMilliseconds),
SUM(HealthServiceUnavailableMilliseconds),
SUM(InWhiteStateMilliseconds),
SUM(InGreenStateMilliseconds),
2,
SUM(UptimeMilliseconds),
CAST(SUM(UptimeMilliseconds) AS FLOAT)*100/SUM(IntervalDurationMilliseconds),
SUM(DowntimeMilliseconds),
100-CAST(SUM(UptimeMilliseconds) AS FLOAT)*100/SUM(IntervalDurationMilliseconds)
FROM
#stateRaw sr
WHERE
sr.IntervalMap&amp;2=2
GROUP BY
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId

END

---- final recordset
IF @XmlOutputOnly = 1
BEGIN
SET @OutputXml =
(
SELECT
RowId, IntervalNo, [DateTime], DateTimeTo,
ManagedEntityMonitorRowId, ManagedEntityRowId, MonitorRowId,
IntervalDurationMilliseconds, InYellowStateMilliseconds,
InRedStateMilliseconds, InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds, InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds, InWhiteStateMilliseconds,
InGreenStateMilliseconds, IntervalMap, UptimeMilliseconds,
UptimePct, DowntimeMilliseconds, DowntimePct
FROM
#stateRaw
WHERE RowType='T'
FOR XML RAW('StateDetail'), ROOT('StateDetails')
)
END
ELSE BEGIN

-- totals - both intervals side by side
SELECT
RowType = 'T',
mm.RowId,
mm.ParentRowId,
IntervalMap = NULL,
t.ManagedEntityMonitorRowId,

mm.ParentManagedEntityMonitorRowId,
mm.[Level],
mm.ChildrenCount,
mm.HasSkippedChildrenInd,

mm.MonitorTypeName,
vm.MonitorDefaultName,
vm.MonitorSystemName,
vmet.ManagedEntityTypeRowId,
vmet.ManagedEntityTypeSystemName,
vmet.ManagedEntityTypeDefaultName,
vmeti.[Image],
vme.[Path],
vme.DisplayName,

t.ManagedEntityRowId,
t.MonitorRowId,
t.DateTime1,
t.IntervalDurationMilliseconds1,
t.InYellowStateMilliseconds1,
t.InRedStateMilliseconds1,
t.InPlannedMaintenanceMilliseconds1,
t.InUnplannedMaintenanceMilliseconds1,
t.InDisabledStateMilliseconds1,
t.HealthServiceUnavailableMilliseconds1,
t.InWhiteStateMilliseconds1,
t.InGreenStateMilliseconds1,
t.UptimeMilliseconds1,
t.UptimePct1,
t.DowntimeMilliseconds1,
t.DowntimePct1,
t.DateTime2,
t.IntervalDurationMilliseconds2,
t.InYellowStateMilliseconds2,
t.InRedStateMilliseconds2,
t.InPlannedMaintenanceMilliseconds2,
t.InUnplannedMaintenanceMilliseconds2,
t.InDisabledStateMilliseconds2,
t.HealthServiceUnavailableMilliseconds2,
t.InWhiteStateMilliseconds2,
t.InGreenStateMilliseconds2,
t.UptimeMilliseconds2,
t.UptimePct2,
t.DowntimeMilliseconds2,
t.DowntimePct2
FROM
(
SELECT
ManagedEntityMonitorRowId=ISNULL(sr1.ManagedEntityMonitorRowId,sr2.ManagedEntityMonitorRowId),
ManagedEntityRowId=ISNULL(sr1.ManagedEntityRowId,sr2.ManagedEntityRowId),
MonitorRowId=ISNULL(sr1.MonitorRowId,sr2.MonitorRowId),
[DateTime1] = sr1.[DateTime],
IntervalDurationMilliseconds1 = sr1.IntervalDurationMilliseconds,
InYellowStateMilliseconds1 = sr1.InYellowStateMilliseconds,
InRedStateMilliseconds1 = sr1.InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds1 = sr1.InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds1 = sr1.InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds1 = sr1.InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds1 = sr1.HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds1 = sr1.InWhiteStateMilliseconds,
InGreenStateMilliseconds1 = sr1.InGreenStateMilliseconds,
UptimeMilliseconds1 = sr1.UptimeMilliseconds,
UptimePct1 = sr1.UptimePct,
DowntimeMilliseconds1 = sr1.DowntimeMilliseconds,
DowntimePct1 = sr1.DowntimePct,

[DateTime2] = sr2.[DateTime],
IntervalDurationMilliseconds2 = sr2.IntervalDurationMilliseconds,
InYellowStateMilliseconds2 = sr2.InYellowStateMilliseconds,
InRedStateMilliseconds2 = sr2.InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds2 = sr2.InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds2 = sr2.InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds2 = sr2.InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds2 = sr2.HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds2 = sr2.InWhiteStateMilliseconds,
InGreenStateMilliseconds2 = sr2.InGreenStateMilliseconds,
UptimeMilliseconds2 = sr2.UptimeMilliseconds,
UptimePct2 = sr2.UptimePct,
DowntimeMilliseconds2 = sr2.DowntimeMilliseconds,
DowntimePct2 = sr2.DowntimePct
FROM
(SELECT * FROM #stateRaw WHERE IntervalMap=1 AND RowType='T') sr1
FULL OUTER JOIN (SELECT * FROM #stateRaw WHERE IntervalMap=2 AND RowType='T') sr2 ON
sr1.ManagedEntityMonitorRowId=sr2.ManagedEntityMonitorRowId
) t
INNER JOIN #meMonitor mm ON mm.ChildManagedEntityMonitorRowId=t.ManagedEntityMonitorRowId
INNER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId = t.MonitorRowId
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = t.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] vmeti ON vmeti.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId AND vmeti.ImageCategory = N'u16x16Icon'

UNION ALL

-- details - only fields for 1st intervals are used, IntervalMap should be used to search for appropriate intervals
SELECT
t.RowType,
mm.RowId,
mm.ParentRowId,
t.IntervalMap,
t.ManagedEntityMonitorRowId,

mm.ParentManagedEntityMonitorRowId,
mm.[Level],
NULL,
NULL,

NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,

t.ManagedEntityRowId,
t.MonitorRowId,
t.DateTime,
t.IntervalDurationMilliseconds,
t.InYellowStateMilliseconds,
t.InRedStateMilliseconds,
t.InPlannedMaintenanceMilliseconds,
t.InUnplannedMaintenanceMilliseconds,
t.InDisabledStateMilliseconds,
t.HealthServiceUnavailableMilliseconds,
t.InWhiteStateMilliseconds,
t.InGreenStateMilliseconds,
t.UptimeMilliseconds,
t.UptimePct,
t.DowntimeMilliseconds,
t.DowntimePct,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
FROM
#stateRaw t
INNER JOIN #meMonitor mm ON mm.ManagedEntityRowId = t.ManagedEntityRowId
WHERE RowType='I' AND @NoDetails=0

END

IF OBJECT_ID('tempdb..#objlist') IS NOT NULL DROP TABLE #objlist
IF OBJECT_ID('tempdb..#mType') IS NOT NULL DROP TABLE #mType
IF OBJECT_ID('tempdb..#meMonitor') IS NOT NULL DROP TABLE #meMonitor
IF OBJECT_ID('tempdb..#stateRaw') IS NOT NULL DROP TABLE #stateRaw
IF OBJECT_ID('tempdb..#artificialIntervals') IS NOT NULL DROP TABLE #artificialIntervals
IF OBJECT_ID('tempdb..#artificialIntervalsStepped') IS NOT NULL DROP TABLE #artificialIntervalsStepped

END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#objlist') IS NOT NULL DROP TABLE #objlist
IF OBJECT_ID('tempdb..#mType') IS NOT NULL DROP TABLE #mType
IF OBJECT_ID('tempdb..#meMonitor') IS NOT NULL DROP TABLE #meMonitor
IF OBJECT_ID('tempdb..#stateRaw') IS NOT NULL DROP TABLE #stateRaw
IF OBJECT_ID('tempdb..#artificialIntervals') IS NOT NULL DROP TABLE #artificialIntervals
IF OBJECT_ID('tempdb..#artificialIntervalsStepped') IS NOT NULL DROP TABLE #artificialIntervalsStepped

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_StateGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_StateDetailsGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_StateDetailsGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_StateDetailsGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_StateDetailsGet]
@pStartDate datetime,
@pEndDate DATETIME,
@pUnhealthyStateList XML,
@pDataAgg TINYINT,
@pManagedEntityMonitorRowId INT
AS
BEGIN
DECLARE @ObjectList NVARCHAR(MAX),
@ManagedEntityTypeSystemName NVARCHAR(512),
@MonitorSystemName NVARCHAR(512)

SELECT
@ObjectList=N'&lt;Data&gt;&lt;Objects&gt;&lt;Object Use="Self"&gt;'+CONVERT(NVARCHAR(MAX),vme.ManagedEntityRowId)+'&lt;/Object&gt;&lt;/Objects&gt;&lt;/Data&gt;',
@ManagedEntityTypeSystemName = vmet.ManagedEntityTypeSystemName,
@MonitorSystemName = vm.MonitorSystemName
FROM
[dbo].[vManagedEntity] vme
INNER JOIN [dbo].[vManagedEntityMonitor] vmem ON vmem.ManagedEntityRowId = vme.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
INNER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId = vmem.MonitorRowId
WHERE vmem.ManagedEntityMonitorRowId=@pManagedEntityMonitorRowId

EXEC [dbo].[Veeam_GRL_StateGet]
@pStartDate = @pStartDate,
@pEndDate = @pEndDate,
@pStartDate2 = null,
@pEndDate2 = null,
@ObjectList = @ObjectList,
@ManagedEntityTypeSystemName = @ManagedEntityTypeSystemName,
@MonitorSystemName = @MonitorSystemName,
@DataAgg = @pDataAgg,
@UnhealthyStateList = @pUnhealthyStateList,
@NoDetails = 0,
@ManagedEntityMonitorRowId = @pManagedEntityMonitorRowId

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_StateDetailsGet] TO OpsMgrReader
GO-- ##### Veeam_GRL_RelationTypesGetByScope_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_RelationTypesGetByScope')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_RelationTypesGetByScope] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_RelationTypesGetByScope]
@ObjectList XML
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY

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

CREATE TABLE #obj
(
ManagedEntityRowId INT
)

CREATE TABLE #reltype
(
RelationshipTypeSystemName NVARCHAR(MAX),
DisplayName NVARCHAR(MAX)
)

INSERT INTO #obj (ManagedEntityRowId)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = null,
@EndDate = null,
@ObjectList = @ObjectList,
@ForceContainment = 1,
@ManagedEntityTypeRowId = null,
@MaxLevel = null,
@XPathType = NULL

INSERT INTO #reltype
(
RelationshipTypeSystemName,
DisplayName
)
SELECT DISTINCT
vrt.RelationshipTypeSystemName,
DisplayName = vrt.RelationshipTypeDefaultName+' ('+ts.ManagedEntityTypeDefaultName+' &gt; '+tt.ManagedEntityTypeDefaultName+')'
FROM
#obj o
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
INNER JOIN [dbo].[vRelationship] vr ON o.ManagedEntityRowId=vr.SourceManagedEntityRowId OR o.ManagedEntityRowId=vr.TargetManagedEntityRowId
-- INNER JOIN [dbo].[vRelationshipTypeManagementPackVersion] vrtmpv ON vme.ManagedEntityTypeRowId=vrtmpv.SourceManagedEntityTypeRowId OR vme.ManagedEntityTypeRowId=vrtmpv.TargetManagedEntityTypeRowId
-- INNER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeRowId = vrtmpv.RelationshipTypeRowId
INNER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeRowId = vr.RelationshipTypeRowId
INNER JOIN [dbo].[vRelationshipTypeManagementPackVersion] vrtmpv ON vrt.RelationshipTypeRowId=vrtmpv.RelationshipTypeRowId
INNER JOIN [dbo].[vManagedEntityType] ts ON vrtmpv.SourceManagedEntityTypeRowId=ts.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagedEntityType] tt ON vrtmpv.TargetManagedEntityTypeRowId=tt.ManagedEntityTypeRowId

IF NOT EXISTS (SELECT TOP 1 1 FROM #reltype)
BEGIN
INSERT INTO #reltype
(
RelationshipTypeSystemName,
DisplayName
)
VALUES
(
'n/a',
'Relationship types not available for selected scope'
)
END

SELECT * FROM #reltype ORDER BY DisplayName

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_RelationTypesGetByScope] TO OpsMgrReader
GO-- ##### Veeam_GRL_RelationTypePartiesGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_RelationTypePartiesGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_RelationTypePartiesGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_RelationTypePartiesGet]
@ReportSystemName NVARCHAR(MAX),
@IncludeBothOption TINYINT=0
AS
BEGIN
DECLARE @OptionsXml XML

SELECT @OptionsXml=vgr.Options
FROM [dbo].[Veeam_GRL_Report] vgr
WHERE vgr.ReportSystemName=@ReportSystemName

SELECT Value=o.t.value('@Value','nvarchar(512)'), Label=o.t.value('@Label','nvarchar(512)')
FROM @OptionsXml.nodes('/RelationTypeParties/RelationTypeParty') AS o(t)
WHERE o.t.value('@Value','nvarchar(512)')&lt;&gt;'ST' OR @IncludeBothOption&gt;0

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_RelationTypePartiesGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_RelationHistoryGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_RelationHistoryGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_RelationHistoryGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_RelationHistoryGet]
@pStartDate DATETIME,
@pEndDate DATETIME,
@ObjectList XML = NULL,
@RelationshipTypeSystemName NVARCHAR(MAX) = NULL,
@GroupBy CHAR(1) = 'S', -- S|T
@ScopeType VARCHAR(2) = 'ST' -- S|T|ST
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#data') IS NOT NULL DROP TABLE #data
IF OBJECT_ID('tempdb..#dates') IS NOT NULL DROP TABLE #dates
IF OBJECT_ID('tempdb..#series') IS NOT NULL DROP TABLE #series

CREATE TABLE #obj
(
ManagedEntityRowId INT
)

CREATE TABLE #data
(
RowId INT IDENTITY PRIMARY KEY,
RowType CHAR(1),
sManagedEntityRowId INT,
sManagedEntityTypeRowId INT,
sManagedEntityTypeDefaultName NVARCHAR(MAX),
sPath NVARCHAR(MAX),
sDisplayName NVARCHAR(MAX),
sImage VARBINARY(MAX),

tManagedEntityRowId INT,
tManagedEntityTypeRowId INT,
tManagedEntityTypeDefaultName NVARCHAR(MAX),
tPath NVARCHAR(MAX),
tDisplayName NVARCHAR(MAX),
tImage VARBINARY(MAX),

FromDateTime DATETIME,
ToDateTime DATETIME,

IsExistsNow BIT,

IsCreated TINYINT,
IsDropped TINYINT,

ChartValue INT,
ChartId INT,

ChangesCount INT DEFAULT 0,

)

CREATE TABLE #dates
(
RowNo INT IDENTITY,
FromDt DATETIME,
ToDt DATETIME,
MiddleDt DATETIME
)

CREATE TABLE #series
(
SeriesId INT,

sManagedEntityRowId INT,
sManagedEntityTypeRowId INT,
sManagedEntityTypeDefaultName NVARCHAR(MAX),
sPath NVARCHAR(MAX),
sDisplayName NVARCHAR(MAX),

tManagedEntityRowId INT,
tManagedEntityTypeRowId INT,
tManagedEntityTypeDefaultName NVARCHAR(MAX),
tPath NVARCHAR(MAX),
tDisplayName NVARCHAR(MAX),
)

INSERT INTO #obj (ManagedEntityRowId)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = null,
@EndDate = null,
@ObjectList = @ObjectList,
@ForceContainment = 1,
@ManagedEntityTypeRowId = null,
@MaxLevel = null,
@XPathType = NULL


INSERT #data
(
RowType, sManagedEntityRowId, sManagedEntityTypeRowId,
sManagedEntityTypeDefaultName, sPath, sDisplayName, sImage,
tManagedEntityRowId, tManagedEntityTypeRowId,
tManagedEntityTypeDefaultName, tPath, tDisplayName, tImage,
FromDateTime, ToDateTime, IsCreated, IsDropped, IsExistsNow
)
SELECT DISTINCT
'D',
sManagedEntityRowId = mes.ManagedEntityRowId,
sManagedEntityTypeRowId = ts.ManagedEntityTypeRowId,
sManagedEntityTypeDefaultName = ts.ManagedEntityTypeDefaultName,
sPath = mes.[Path],
sDisplayName = mes.DisplayName,
sImage = ims.[Image],

tManagedEntityRowId = met.ManagedEntityRowId,
tManagedEntityTypeRowId = tt.ManagedEntityTypeRowId,
tManagedEntityTypeDefaultName = tt.ManagedEntityTypeDefaultName,
tPath = met.[Path],
tDisplayName = met.DisplayName,
tImage = imt.[Image],

FromDateTime=convert(datetime,convert(varchar(64),vrp.FromDateTime,100),100),
ToDateTime = convert(datetime,convert(varchar(64),isnull(vrp.ToDateTime,GETUTCDATE()),100),100),

IsCreated = CASE WHEN vrp.FromDateTime BETWEEN @pStartDate AND @pEndDate THEN 1 ELSE 0 END,
IsDropped = CASE WHEN ISNULL(vrp.ToDateTime,'99991231') BETWEEN @pStartDate AND @pEndDate THEN 1 ELSE 0 END,

IsExistsNow = CASE WHEN vrp.ToDateTime IS NULL THEN 1 ELSE 0 END

FROM
[dbo].[vRelationship] vr
INNER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeRowId = vr.RelationshipTypeRowId
INNER JOIN [dbo].[vRelationshipProperty] vrp ON vrp.RelationshipRowId = vr.RelationshipRowId
INNER JOIN #obj o ON
(o.ManagedEntityRowId=vr.SourceManagedEntityRowId AND CHARINDEX('S',@ScopeType)&gt;0)
OR
(o.ManagedEntityRowId=vr.TargetManagedEntityRowId AND CHARINDEX('T',@ScopeType)&gt;0)
INNER JOIN [dbo].[vManagedEntity] mes ON mes.ManagedEntityRowId=vr.SourceManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] ts ON mes.ManagedEntityTypeRowId=ts.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagedEntity] met ON met.ManagedEntityRowId=vr.TargetManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] tt ON met.ManagedEntityTypeRowId=tt.ManagedEntityTypeRowId
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] ims ON ts.ManagedEntityTypeRowId=ims.ManagedEntityTypeRowId AND ims.ImageCategory=N'u16x16Icon'
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] imt ON tt.ManagedEntityTypeRowId=imt.ManagedEntityTypeRowId AND imt.ImageCategory=N'u16x16Icon'
WHERE
vrp.FromDateTime&lt;@pEndDate AND ISNULL(vrp.ToDateTime,'99991231')&gt;@pStartDate
AND vrt.RelationshipTypeSystemName=@RelationshipTypeSystemName

IF @GroupBy='S'
BEGIN

INSERT INTO #series
(
SeriesId,

sManagedEntityRowId,
sManagedEntityTypeRowId,
sManagedEntityTypeDefaultName,
sPath,
sDisplayName,

tManagedEntityRowId,
tManagedEntityTypeRowId,
tManagedEntityTypeDefaultName,
tPath,
tDisplayName
)
SELECT
ROW_NUMBER() OVER (PARTITION BY X.sManagedEntityRowId ORDER BY ISNULL(X.tPath,'') Asc, X.tDisplayName Asc),
X.sManagedEntityRowId, X.sManagedEntityTypeRowId,
X.sManagedEntityTypeDefaultName, X.sPath, X.sDisplayName,
X.tManagedEntityRowId, X.tManagedEntityTypeRowId,
X.tManagedEntityTypeDefaultName, X.tPath, X.tDisplayName
FROM
(SELECT DISTINCT
d.sManagedEntityRowId, d.sManagedEntityTypeRowId,
d.sManagedEntityTypeDefaultName, d.sPath, d.sDisplayName,
d.tManagedEntityRowId, d.tManagedEntityTypeRowId,
d.tManagedEntityTypeDefaultName, d.tPath, d.tDisplayName
FROM #data d) X

;WITH stat (sManagedEntityRowId, cnt)
AS
(
SELECT d.sManagedEntityRowId, COUNT(1)
FROM
#data d
GROUP BY d.sManagedEntityRowId
)
UPDATE d
SET ChangesCount = s.cnt
FROM
#data d
INNER JOIN stat s ON s.sManagedEntityRowId = d.sManagedEntityRowId

END
ELSE BEGIN
INSERT INTO #series
(
SeriesId,

sManagedEntityRowId,
sManagedEntityTypeRowId,
sManagedEntityTypeDefaultName,
sPath,
sDisplayName,

tManagedEntityRowId,
tManagedEntityTypeRowId,
tManagedEntityTypeDefaultName,
tPath,
tDisplayName
)
SELECT
ROW_NUMBER() OVER (PARTITION BY X.tManagedEntityRowId ORDER BY ISNULL(X.sPath,'') Asc, X.sDisplayName Asc),
X.sManagedEntityRowId, X.sManagedEntityTypeRowId,
X.sManagedEntityTypeDefaultName, X.sPath, X.sDisplayName,
X.tManagedEntityRowId, X.tManagedEntityTypeRowId,
X.tManagedEntityTypeDefaultName, X.tPath, X.tDisplayName
FROM
(SELECT DISTINCT
d.sManagedEntityRowId, d.sManagedEntityTypeRowId,
d.sManagedEntityTypeDefaultName, d.sPath, d.sDisplayName,
d.tManagedEntityRowId, d.tManagedEntityTypeRowId,
d.tManagedEntityTypeDefaultName, d.tPath, d.tDisplayName
FROM #data d) X

;WITH stat (tManagedEntityRowId, cnt)
AS
(
SELECT d.tManagedEntityRowId, COUNT(1)
FROM
#data d
GROUP BY d.tManagedEntityRowId
)
UPDATE d
SET ChangesCount = s.cnt
FROM
#data d
INNER JOIN stat s ON s.tManagedEntityRowId = d.tManagedEntityRowId

END

INSERT #dates (FromDt)
SELECT FromDateTime FROM #data
UNION
SELECT ToDateTime FROM #data
UNION
SELECT @pStartDate
UNION
SELECT @pEndDate

UPDATE d1
SET ToDt = d2.FromDt
FROM
#dates d1
INNER JOIN #dates d2 ON d1.RowNo=d2.RowNo-1

UPDATE #dates
SET MiddleDt = DATEADD(second,DATEDIFF(minute,FromDt,ToDt)/2,FromDt)

INSERT INTO #data
(
RowType,
sManagedEntityRowId,
sManagedEntityTypeRowId,
sManagedEntityTypeDefaultName,
sPath,
sDisplayName,
tManagedEntityRowId,
tManagedEntityTypeRowId,
tManagedEntityTypeDefaultName,
tPath,
tDisplayName,
FromDateTime,
ChartValue,
ChartId
)
SELECT
'C',
pnt.sManagedEntityRowId,
pnt.sManagedEntityTypeRowId,
pnt.sManagedEntityTypeDefaultName,
pnt.sPath,
pnt.sDisplayName,
pnt.tManagedEntityRowId,
pnt.tManagedEntityTypeRowId,
pnt.tManagedEntityTypeDefaultName,
pnt.tPath,
pnt.tDisplayName,
pnt.dt,
CASE WHEN z.RowId IS NULL THEN NULL ELSE pnt.SeriesId END,
(pnt.SeriesId-1)/10
FROM
(
SELECT
s.*,
d.dt
FROM
#series s,
(
SELECT dt = FromDt FROM #dates
UNION
SELECT dt = ToDt FROM #dates WHERE ToDt IS NOT NULL
UNION
SELECT dt = MiddleDt FROM #dates WHERE MiddleDt IS NOT NULL
) d
WHERE d.dt BETWEEN @pStartDate AND @pEndDate
) as pnt
LEFT OUTER JOIN #data z ON z.sManagedEntityRowId=pnt.sManagedEntityRowId AND z.tManagedEntityRowId=pnt.tManagedEntityRowId AND pnt.dt BETWEEN z.FromDateTime AND z.ToDateTime
ORDER BY pnt.sManagedEntityRowId, pnt.tManagedEntityRowId, pnt.dt

SELECT * FROM #data

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_RelationHistoryGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_ReportDetailsGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ReportDetailsGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ReportDetailsGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_ReportDetailsGet]
@ReportSystemName NVARCHAR(256)
AS
BEGIN
IF EXISTS(SELECT TOP 1 1 FROM [dbo].[Veeam_GRL_Report] r WHERE r.ReportSystemName=@ReportSystemName)
SELECT
ReportDefaultName = r.ReportDisplayName,
ReportDefaultDescription = CASE WHEN len(isnull(r.ReportDescription,''))&gt;0 THEN r.ReportDescription ELSE 'Description for this report is not available.' END,
MPSystemName = vmp.ManagementPackSystemName,
MPName = Replace(isnull(vmp.ManagementPackDefaultName,''),'Veeam ','')
FROM
[dbo].[Veeam_GRL_Report] r LEFT OUTER JOIN
[dbo].[vManagementPack] vmp ON r.MPSystemName=vmp.ManagementPackSystemName
WHERE r.ReportSystemName=@ReportSystemName
ELSE
SELECT
ReportDefaultName = 'Generic Report',
ReportDefaultDescription = 'Veeam generic report',
MPSystemName = vmp.ManagementPackSystemName,
MPName = Replace(vmp.ManagementPackDefaultName,'Veeam ','')
FROM
[dbo].[vManagementPack] vmp
WHERE vmp.ManagementPackSystemName='Veeam.Report.Library'
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ReportDetailsGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_SortModesGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_SortModesGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_SortModesGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_SortModesGet]
@ReportSystemName NVARCHAR(MAX)
AS
BEGIN
DECLARE @OptionsXml XML

SELECT @OptionsXml=vgr.Options
FROM [dbo].[Veeam_GRL_Report] vgr
WHERE vgr.ReportSystemName=@ReportSystemName

SELECT Value=o.t.value('@Value','nvarchar(512)'), Label=o.t.value('@Label','nvarchar(512)')
FROM @OptionsXml.nodes('/SortModes/SortMode') AS o(t)

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_SortModesGet] TO OpsMgrReader
GO-- ##### Veeam_GRL_DefaultObjectListGetByReport_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_DefaultObjectListGetByReport')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_DefaultObjectListGetByReport] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_DefaultObjectListGetByReport]
@mg UNIQUEIDENTIFIER,
@ReportSystemName NVARCHAR(512)
AS
BEGIN

BEGIN TRY
DECLARE @OptionsXml XML

SELECT @OptionsXml=vgr.Options
FROM [dbo].[Veeam_GRL_Report] vgr
WHERE vgr.ReportSystemName=@ReportSystemName

SELECT
DefaultObjectList =
CAST(ISNULL((
SELECT [Objects]=
( SELECT
[Object/@Use]='Containment',
[Object]=vme.ManagedEntityRowId
FROM
[dbo].[vManagedEntityType] vmet
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagementGroup] vmg ON vmg.ManagementGroupRowId = vme.ManagementGroupRowId
INNER JOIN @OptionsXml.nodes('/Options/DefaultObjectList/ManagedEntityTypeSystemName') AS o(n) ON vmet.ManagedEntityTypeSystemName=o.n.value('.','nvarchar(max)')
WHERE
vmg.ManagementGroupGuid=@mg
FOR XML PATH(''), ELEMENTS, TYPE
)
FOR XML PATH('Data')
),'&lt;Data /&gt;') AS XML)

END TRY
BEGIN CATCH

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_DefaultObjectListGetByReport] TO OpsMgrReader
GO
-- ##### Veeam_GRL_CurrentSummaryGetByScope_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_CurrentSummaryGetByScope')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_CurrentSummaryGetByScope] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_CurrentSummaryGetByScope]
@ReportSystemName NVARCHAR(256),
@ObjectList XML,
@XmlOutputOnly BIT = 0,
@OutputXml XML = NULL OUT
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY
DECLARE @Config XML

SELECT @Config=vgr.Options
FROM [dbo].[Veeam_GRL_Report] vgr
WHERE vgr.ReportSystemName=@ReportSystemName

DECLARE
@sDt DATETIME,
@eDt DATETIME

SET @eDt=GETUTCDATE()
SET @sDt=DATEADD(hour,-5,@eDt)

IF OBJECT_ID('tempdb..#SGroup') IS NOT NULL DROP TABLE #SGroup
IF OBJECT_ID('tempdb..#SElement') IS NOT NULL DROP TABLE #SElement
IF OBJECT_ID('tempdb..#SSubElement') IS NOT NULL DROP TABLE #SSubElement
IF OBJECT_ID('tempdb..#ScopeObj') IS NOT NULL DROP TABLE #ScopeObj

CREATE TABLE #SGroup
(
GroupId INT PRIMARY KEY,
[Name] NVARCHAR(MAX),
BaseClass NVARCHAR(MAX),
ManagedEntityTypeRowId INT
)

CREATE TABLE #SElement
(
ElementId INT IDENTITY PRIMARY KEY,
GroupId INT,
[Name] NVARCHAR(MAX),
[Type] NVARCHAR(MAX),
[Source] NVARCHAR(MAX),
[Value] FLOAT,
StringValue NVARCHAR(MAX)
)

CREATE TABLE #SSubElement
(
SubElementId INT IDENTITY PRIMARY KEY,
ElementId INT,
ManagedEntityRowId INT,
[Value] FLOAT,
StringValue NVARCHAR(MAX)
)

CREATE TABLE #ScopeObj
(
ManagedEntityTypeRowId INT,
ManagedEntityRowId INT
)

-- parsing configuration
INSERT INTO #SGroup
(
GroupId,
Name,
BaseClass,
ManagedEntityTypeRowId
)
SELECT
cfg.gr.value('@ID','int'),
cfg.gr.value('@Name','nvarchar(max)'),
cfg.gr.value('@BaseClass','nvarchar(max)'),
vmet.ManagedEntityTypeRowId
FROM
@Config.nodes('/Options/ScopeSummaryConfig/Group') AS cfg(gr)
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeSystemName=cfg.gr.value('@BaseClass','nvarchar(max)')

INSERT INTO #SElement
(
GroupId,
[Name],
[Type],
[Source]
)
SELECT
cfg.gr.value('../@ID','int'),
cfg.gr.value('@Name','nvarchar(max)'),
cfg.gr.value('@Type','nvarchar(max)'),
cfg.gr.value('@Source','nvarchar(max)')
FROM
@Config.nodes('/Options/ScopeSummaryConfig/Group/Element') AS cfg(gr)
INNER JOIN #SGroup s ON s.GroupId=cfg.gr.value('../@ID','int')

-- getting objects
DECLARE
@METId INT,
@BaseClass NVARCHAR(MAX),
@Objects XML

DECLARE cur CURSOR FOR
SELECT DISTINCT s.ManagedEntityTypeRowId, s.BaseClass FROM #SGroup s

OPEN cur

FETCH cur INTO @METId, @BaseClass

WHILE @@FETCH_STATUS=0
BEGIN
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @sDt,
@EndDate = @eDt,
@ObjectList = @ObjectList,
@ManagedEntityTypeRowId = @METId,
@XmlOutputOnly = 1,
@OutputXml = @Objects OUT

IF @Objects IS NOT NULL
BEGIN
INSERT INTO #ScopeObj
(
ManagedEntityTypeRowId,
ManagedEntityRowId
)
SELECT
@METId,
O.o.value('.','int')
FROM
@Objects.nodes('/Objects/Object/ManagedEntityRowId') AS O(o)
END

SET @Objects = NULL

FETCH cur INTO @METId, @BaseClass
END

CLOSE cur
DEALLOCATE cur

-- generating sub-objects
INSERT INTO #SSubElement
(
ElementId,
ManagedEntityRowId
)
SELECT
e.ElementId,
o.ManagedEntityRowId
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #ScopeObj o ON o.ManagedEntityTypeRowId = g.ManagedEntityTypeRowId
WHERE
e.Source IS NOT NULL

---- ObjectCount
-- calculating elements
;WITH cnt
AS
(
SELECT
e.ElementId,
Cnt=COUNT(1)
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #ScopeObj o ON o.ManagedEntityTypeRowId = g.ManagedEntityTypeRowId
WHERE
e.[Type]='ObjectCount'
GROUP BY
e.ElementId
)
UPDATE e
SET [Value] = c.Cnt
FROM
#SElement e
INNER JOIN cnt c ON c.ElementId = e.ElementId

---- PropertySum
-- getting properties
;WITH pv
AS
(
SELECT
se.SubElementId,
PropertyValue = CASE WHEN ISNUMERIC(vmeps.PropertyValue)=1 THEN CONVERT(FLOAT,vmeps.PropertyValue) ELSE NULL END
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #SSubElement se ON se.ElementId = e.ElementId AND e.[Type]='PropertySum'
INNER JOIN [dbo].[vManagedEntityTypeProperty] vmetp ON vmetp.ManagedEntityTypeRowId = g.ManagedEntityTypeRowId AND vmetp.PropertySystemName=e.Source
INNER JOIN [dbo].[vManagedEntityPropertySet] vmeps ON vmeps.ManagedEntityRowId = se.ManagedEntityRowId AND vmeps.PropertyGuid = vmetp.PropertyGuid AND vmeps.ToDateTime IS NULL
)
UPDATE se
SET [Value] = pv.PropertyValue
FROM
#SSubElement se
INNER JOIN pv pv ON pv.SubElementId = se.SubElementId

---- PropertyStringValue
-- geting properties
;WITH pv
AS
(
SELECT
se.SubElementId,
PropertyValue = vmeps.PropertyValue
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #SSubElement se ON se.ElementId = e.ElementId AND e.[Type]='PropertyStringValue'
INNER JOIN [dbo].[vManagedEntityTypeProperty] vmetp ON vmetp.ManagedEntityTypeRowId = g.ManagedEntityTypeRowId AND vmetp.PropertySystemName=e.Source
INNER JOIN [dbo].[vManagedEntityPropertySet] vmeps ON vmeps.ManagedEntityRowId = se.ManagedEntityRowId AND vmeps.PropertyGuid = vmetp.PropertyGuid AND vmeps.ToDateTime IS NULL
)
UPDATE se
SET se.StringValue = pv.PropertyValue
FROM
#SSubElement se
INNER JOIN pv pv ON pv.SubElementId = se.SubElementId

---- ChildProperySum
-- geting properties
;WITH pids (SubElementId, ManagedEntityRowId, TargetManagedEntityRowId, PropertyGuid)
AS
(
SELECT
se.SubElementId,
se.ManagedEntityRowId,
vr.TargetManagedEntityRowId,
vmetp.PropertyGuid
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #SSubElement se ON se.ElementId = e.ElementId AND e.[Type]='ChildPropertySum'
INNER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeSystemName=LEFT(e.Source,CHARINDEX('/',e.Source)-1)
INNER JOIN [dbo].[vRelationship] vr ON vr.RelationshipTypeRowId = vrt.RelationshipTypeRowId AND vr.SourceManagedEntityRowId=se.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntity] vme ON vr.TargetManagedEntityRowId=vme.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityTypeProperty] vmetp ON vmetp.ManagedEntityTypeRowId=vme.ManagedEntityTypeRowId AND vmetp.PropertySystemName=REPLACE(e.Source,vrt.RelationshipTypeSystemName+'/','')
),
val (SubElementId, [Value])
AS
(
SELECT
p.SubElementId,
[Value]=Sum(CASE WHEN ISNUMERIC(vmeps.PropertyValue)=1 THEN CONVERT(FLOAT,vmeps.PropertyValue) ELSE NULL END)
FROM
[dbo].[vManagedEntityPropertySet] vmeps
INNER JOIN pids p ON vmeps.ManagedEntityRowId=p.TargetManagedEntityRowId AND vmeps.PropertyGuid=p.PropertyGuid AND vmeps.ToDateTime IS NULL
GROUP BY p.SubElementId
)
UPDATE se
SET
se.[Value] = v.[Value]
FROM
#SSubElement se
INNER JOIN val v ON se.SubElementId=v.SubElementId

---- PerformanceLastSum
-- geting last sample
;WITH perf
AS
(
SELECT
se.SubElementId,
Value = vpr.AverageValue,
RowNo = ROW_NUMBER() OVER ( PARTITION BY se.SubElementId ORDER BY vpr.[DateTime] DESC, vpri.PerformanceRuleInstanceRowId ASC )
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId AND e.[Type]='PerformanceLastSum'
INNER JOIN #SSubElement se ON se.ElementId = e.ElementId
INNER JOIN [dbo].[vRule] vr ON vr.RuleSystemName=e.Source
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.RuleRowId = vr.RuleRowId
INNER JOIN Perf.vPerfHourly vpr ON vpr.PerformanceRuleInstanceRowId = vpri.PerformanceRuleInstanceRowId AND vpr.ManagedEntityRowId = se.ManagedEntityRowId
WHERE
vpr.[DateTime]&gt;=@sDt
)
UPDATE se
SET [Value] = p.[Value]
FROM
#SSubElement se
INNER JOIN perf p ON p.SubElementId = se.SubElementId AND p.RowNo=1

---- calculating totals
;WITH pvs
AS
(
SELECT
se.ElementId,
[Value] = SUM(se.[Value])
FROM
#SSubElement se
INNER JOIN #SElement s ON s.ElementId = se.ElementId
GROUP BY
se.ElementId
)
UPDATE e
SET [Value] = pvs.[Value]
FROM
#SElement e
INNER JOIN pvs ON pvs.ElementId = e.ElementId

IF @XmlOutputOnly=1
BEGIN
SET @OutputXml = (
SELECT *
FROM
(
SELECT
e.GroupId,
e.ElementId,
GroupName = g.Name,
ElementName = e.Name,

ManagedEntityRowId = NULL,
ManagedEntityName = NULL,

e.[Value],
e.StringValue
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
WHERE e.[Type]&lt;&gt;'PropertyStringValue'
UNION ALL
SELECT
e.GroupId,
e.ElementId,
GroupName = g.Name,
ElementName = e.Name,

ManagedEntityRowId = se.ManagedEntityRowId,
ManagedEntityName = vme.DisplayName,

se.[Value],
se.StringValue
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #SSubElement se ON se.ElementId = e.ElementId
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = se.ManagedEntityRowId
) X
FOR XML RAW('Element'), ROOT('Summary')
)
END
ELSE
BEGIN
SELECT
e.GroupId,
e.ElementId,
GroupName = g.Name,
ElementName = e.Name,

ManagedEntityRowId = NULL,
ManagedEntityName = NULL,

e.[Value],
e.StringValue
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
WHERE e.[Type]&lt;&gt;'PropertyStringValue'
UNION ALL
SELECT
e.GroupId,
e.ElementId,
GroupName = g.Name,
ElementName = e.Name,

ManagedEntityRowId = se.ManagedEntityRowId,
ManagedEntityName = vme.DisplayName,

se.[Value],
se.StringValue
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #SSubElement se ON se.ElementId = e.ElementId
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = se.ManagedEntityRowId
END

END TRY
BEGIN CATCH

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_CurrentSummaryGetByScope] TO OpsMgrReader
GO-- ##### Veeam_GRL_CheckServiceAvailability_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_CheckServiceAvailability')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_CheckServiceAvailability] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_CheckServiceAvailability]
@mg UNIQUEIDENTIFIER,
@reportType NVARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_CheckServiceAvailability')
BEGIN
EXEC dbo.[Veeam_CheckServiceAvailability]
@mg,
@reportType
END
END TRY
BEGIN CATCH
DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_CheckServiceAvailability] TO OpsMgrReader
GO
-- ##### Veeam_GRL_PropertiesGetByScope_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PropertiesGetByScope')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_PropertiesGetByScope] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_PropertiesGetByScope]
@ObjectList XML,
@ReportSystemName NVARCHAR(MAX)
AS
BEGIN
BEGIN TRY
-- get options
DECLARE @OptionsXml XML

SELECT @OptionsXml=vgr.Options
FROM [dbo].[Veeam_GRL_Report] vgr
WHERE vgr.ReportSystemName=@ReportSystemName

-- get type filter
DECLARE @METFilter TABLE
(
ManagedEntityTypeRowId INT
)

INSERT @METFilter (ManagedEntityTypeRowId)
SELECT
vmet.ManagedEntityTypeRowId
FROM
@OptionsXml.nodes('/Options/ObjectListFilter/ManagedEntityTypeSystemName') o(t)
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeSystemName=o.t.value('.','nvarchar(max)')

-- get all objects in scope
DECLARE @objects XML

EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = null,
@EndDate = null,
@ObjectList = @ObjectList,
@ForceContainment = 0,
@XPathType = 0,
@HostedOnly = 0,
@XmlOutputOnly = 1,
@OutputXml = @objects OUT

-- get property list
;WITH mets (ManagedEntityTypeRowId, BaseManagedEntityTypeRowId, OriginalManagedEntityTypeRowId, [Level])
AS
(
-- get all types for selected objects ...
SELECT DISTINCT
vme.ManagedEntityTypeRowId,
vmetmpv.BaseManagedEntityTypeRowId,
vme.ManagedEntityTypeRowId,
1
FROM
@objects.nodes('/Objects/Object/ManagedEntityRowId') AS o(t)
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.t.value('.','int')
INNER JOIN [dbo].[vManagedEntityTypeManagementPackVersion] vmetmpv ON vmetmpv.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
UNION ALL
-- ... and base type hierarchy
SELECT
tmpv.ManagedEntityTypeRowId,
tmpv.BaseManagedEntityTypeRowId,
m.OriginalManagedEntityTypeRowId,
m.[Level]+1
FROM
mets m
INNER JOIN [dbo].[vManagedEntityTypeManagementPackVersion] tmpv ON m.BaseManagedEntityTypeRowId=tmpv.ManagedEntityTypeRowId
)

-- get properties
SELECT DISTINCT
vmetp.PropertyGuid,
PropertyIdXml = '&lt;Property Guid="'+CAST(vmetp.PropertyGuid AS VARCHAR(max))+'" ManagedEntityTypeRowId="'+CAST(vmet.ManagedEntityTypeRowId AS NVARCHAR(max))+'" /&gt;',
vmetp.PropertyDefaultName,
vmet.ManagedEntityTypeDefaultName,
BaseManagedEntityTypeDefaultName = vmetbase.ManagedEntityTypeDefaultName,
m.OriginalManagedEntityTypeRowId,
m.[Level]
FROM
mets m
INNER JOIN [dbo].[vManagedEntityTypeProperty] vmetp ON vmetp.ManagedEntityTypeRowId=m.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON m.OriginalManagedEntityTypeRowId=vmet.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagedEntityType] vmetbase ON m.ManagedEntityTypeRowId=vmetbase.ManagedEntityTypeRowId
LEFT OUTER JOIN @METFilter f ON m.OriginalManagedEntityTypeRowId=f.ManagedEntityTypeRowId
WHERE
-- apply type filter or ignore if empty
(f.ManagedEntityTypeRowId IS NOT NULL
OR NOT EXISTS (SELECT 1 FROM @METFilter))
-- no "object status" property
AND vmetp.PropertyDefaultName NOT IN ('Object Status','Notes', 'Asset Status', 'Reserved1', 'Reserved2')
ORDER BY vmet.ManagedEntityTypeDefaultName, vmetp.PropertyDefaultName

END TRY
BEGIN CATCH

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_PropertiesGetByScope] TO OpsMgrReader
GO
--------------------------------------------------------------------------------------
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Veeam_GRL_VMSnapshotGet]') AND type in (N'P'))
BEGIN
EXECUTE ('CREATE PROCEDURE [dbo].[Veeam_GRL_VMSnapshotGet] AS RETURN 1')
END
GO


ALTER PROCEDURE [dbo].[Veeam_GRL_VMSnapshotGet]
@StartDate DATETIME,
@EndDate DATETIME,
@ObjectList XML,
@ObjectTypeSystemName NVARCHAR(MAX),
@ManagedEntityTypeSystemName NVARCHAR(MAX),
@SnapshotAgeRuleName NVARCHAR(MAX),
@SnapshotSizeRuleName NVARCHAR(MAX),
@VmNamePropertyName NVARCHAR(MAX),
@SnapshotNamePropertyName NVARCHAR(MAX),
@CreateTimePropertyName NVARCHAR(MAX),
@SnapshotSizePropertyName NVARCHAR(MAX),
@SnapshotDescriptionPropertyName NVARCHAR(MAX),
@VmId NVARCHAR(MAX)
AS
BEGIN

DECLARE
@ErrorInd bit
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)
,@ErrorMessageText nvarchar(4000)

DECLARE
@ManagedEntityTypeRowId INT,
@VMNamePropertyID INT,
@SnapshotNamePropertyID INT,
@CreatedDatePropertyID INT,
@SizePropertyID INT,
@DescriptionPropertyID INT,
@ObjectType INT,
@SnapshotAgeRule UNIQUEIDENTIFIER,
@SnapshotSizeRule UNIQUEIDENTIFIER

BEGIN TRY

--SELECT @ObjectType=votp.ObjectTypeId FROM VeeamMP.vObjectType AS votp WHERE votp.SystemName='Veeam.Virt.Extensions.VMware.VMSnapshot'
--SELECT @VMNamePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName='vmName' AND votp.ObjectTypeId=@ObjectType
--SELECT @SnapshotNamePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName='vmSnapshotName' AND votp.ObjectTypeId=@ObjectType
--SELECT @CreatedDatePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName='createTime' AND votp.ObjectTypeId=@ObjectType
--SELECT @SizePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName='size' AND votp.ObjectTypeId=@ObjectType
--SELECT @DescriptionPropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName='description' AND votp.ObjectTypeId=@ObjectType

--SELECT @ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId FROM [dbo].[vManagedEntityType] vmet WHERE vmet.ManagedEntityTypeSystemName = 'Veeam.Virt.Extensions.VMware.VMGUEST'

--SELECT @SnapshotAgeRule=vr.RuleGuid FROM [dbo].[vRule] vr WHERE vr.RuleSystemName = 'Veeam.Virt.Extensions.VMware.VMGUEST.Collect.snapshotAge'
--SELECT @SnapshotSizeRule=vr.RuleGuid FROM [dbo].[vRule] vr WHERE vr.RuleSystemName = 'Veeam.Virt.Extensions.VMware.VMGUEST.Collect.snapshotsSize'

SELECT @ObjectType=votp.ObjectTypeId FROM VeeamMP.vObjectType AS votp WHERE votp.SystemName=@ObjectTypeSystemName
SELECT @VMNamePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName=@VmNamePropertyName AND votp.ObjectTypeId=@ObjectType
SELECT @SnapshotNamePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName=@SnapshotNamePropertyName AND votp.ObjectTypeId=@ObjectType
SELECT @CreatedDatePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName=@CreateTimePropertyName AND votp.ObjectTypeId=@ObjectType
SELECT @SizePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName=@SnapshotSizePropertyName AND votp.ObjectTypeId=@ObjectType
SELECT @DescriptionPropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName=@SnapshotDescriptionPropertyName AND votp.ObjectTypeId=@ObjectType

SELECT @ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId FROM [dbo].[vManagedEntityType] vmet WHERE vmet.ManagedEntityTypeSystemName = @ManagedEntityTypeSystemName
--'Veeam.Virt.Extensions.HyperV.VMRule.SnapshotSize'
--'Veeam.Virt.Extensions.HyperV.VMRule.SnapshotAge'

SELECT @SnapshotAgeRule=vr.RuleGuid FROM [dbo].[vRule] vr WHERE vr.RuleSystemName = @SnapshotAgeRuleName
SELECT @SnapshotSizeRule=vr.RuleGuid FROM [dbo].[vRule] vr WHERE vr.RuleSystemName = @SnapshotSizeRuleName

CREATE TABLE #vmDW
(
ManagedEntityId INT,
VMName NVARCHAR(MAX)
)

CREATE TABLE #vmSnapshot
(
ManagedEntityId INT,
DWManagedEntityId INT,
VMId NVARCHAR(MAX)
)

-- build VMs list
INSERT INTO #vmDW
(
ManagedEntityId
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate,
@EndDate = @EndDate,
@ObjectList = @ObjectList,
@ForceContainment = 1,
@ManagedEntityTypeRowId = @ManagedEntityTypeRowId

UPDATE vm
SET vm.VMName=vme.Name
FROM #vmDW AS vm
INNER JOIN dbo.vManagedEntity AS vme ON vm.ManagedEntityId=vme.ManagedEntityRowId

INSERT INTO #vmSnapshot
(
ManagedEntityId,
VMId,
DWManagedEntityId
)
SELECT DISTINCT
vo.ObjectId,
vopv.[Value],
vm.ManagedEntityId
FROM VeeamMP.vObject AS vo
INNER JOIN VeeamMP.vObjectType AS vot ON vot.ObjectTypeId = vo.TypeId
INNER JOIN VeeamMP.vObjectPropertyValue AS vopv ON vopv.ObjectGuid=vo.ObjectGuid
INNER JOIN #vmDW AS vm ON vopv.[Value]=vm.VMName
INNER JOIN VeeamMP.vObjectTypeProperty AS votp ON votp.ObjectTypePropertyId=vopv.ObjectTypePropertyId
WHERE vot.SystemName=@ObjectTypeSystemName AND votp.SystemName=@VmId--'VMID'

--get total perf metric
--to be deleted after fix collector
DECLARE @vmObjects XML
SET @vmObjects =
(
SELECT
(
SELECT
v.ManagedEntityRowId AS [Object]
FROM dbo.vManagedEntity AS v
FOR XML PATH('') ,TYPE
)
FOR XML PATH('Objects') , ROOT('Data'),TYPE
)
CREATE TABLE #rawdata
(
[DATETIME] DATETIME,
RuleRowId INT,
ManagedEntityRowId INT,
SampleCount INT,
AverageValue FLOAT,
SumAvgValue FLOAT,
MinValue FLOAT,
MaxValue FLOAT
)

DECLARE @PerfRequestConfig XML,
@PerfResponse XML

SET @PerfRequestConfig =
(
SELECT
[Value] = @vmObjects.query('/Data[1]/Objects[1]/Object'),
[Value/Rule] = @SnapshotSizeRule
FOR XML PATH('Values'), ROOT('Data')
)

DECLARE @perfStartdatetime DATETIME,
@perfEnddatetime DATETIME
set @perfStartdatetime = dateadd(hour,-24,GETDATE())
set @perfEnddatetime = GETDATE()

EXEC [dbo].[Veeam_GRL_PerformanceGet]
@dtStart = @perfStartdatetime,
@dtEnd = @perfEnddatetime,
@config = @PerfRequestConfig,
@DataAgg = 0,
@DataMode = 'G',
@SectionMode = 'N',
@Histogram = 0,
@enableTrendCalc = 1,
@XmlOutputOnly = 1,
@OutputXml = @PerfResponse OUT

INSERT INTO #rawdata
(
[DATETIME],
RuleRowId,
ManagedEntityRowId,
SampleCount,
AverageValue,
SumAvgValue,
MinValue,
MaxValue
)
SELECT

p.n.value('@DateTime', 'DATETIME'),
p.n.value('@RuleRowId', 'INT'),
p.n.value('@ManagedEntityRowId', 'INT'),
p.n.value('@SampleCount', 'INT'),
p.n.value('@AverageValue', 'Float'),
p.n.value('@SumAvgValue', 'Float'),
p.n.value('@MinValue', 'Float'),
p.n.value('@MaxValue', 'Float')
FROM @PerfResponse.nodes('/Performance/PerfPoints/PerfPoint[@RowType="I"]') AS p(n)


SELECT DISTINCT
VMName=vmName.[Value],
SnapshotName=snapshotName.[Value],
DataCreated= dataCreated.[Value],--CAST(dataCreated.[Value] AS DATETIME),
[SIZE]=sizeSnapshot.[Value],
[DESCRIPTION]=descriptionSnapshot.[Value],
vs.DWManagedEntityId,
SnapshotAgeRuleGuid=@SnapshotAgeRule,
SnapshotSizeRuleGuid=@SnapshotSizeRule,
isnull(r.AverageValue,-1) TotalVmSize
FROM VeeamMP.vObject AS vo
INNER JOIN #vmSnapshot AS vs ON vo.ObjectId=vs.ManagedEntityId
INNER JOIN VeeamMP.vObjectPropertyValue AS vmName ON vo.ObjectGuid=vmName.ObjectGuid AND vmName.ObjectTypePropertyId=@VMNamePropertyID
INNER JOIN VeeamMP.vObjectPropertyValue AS snapshotName ON vo.ObjectGuid=snapshotName.ObjectGuid AND snapshotName.ObjectTypePropertyId=@SnapshotNamePropertyID
INNER JOIN VeeamMP.vObjectPropertyValue AS dataCreated ON vo.ObjectGuid=dataCreated.ObjectGuid AND dataCreated.ObjectTypePropertyId=@createdDatePropertyID
INNER JOIN VeeamMP.vObjectPropertyValue AS sizeSnapshot ON vo.ObjectGuid=sizeSnapshot.ObjectGuid AND sizeSnapshot.ObjectTypePropertyId=@SizePropertyID
INNER JOIN VeeamMP.vObjectPropertyValue AS descriptionSnapshot ON vo.ObjectGuid=descriptionSnapshot.ObjectGuid AND descriptionSnapshot.ObjectTypePropertyId=@descriptionPropertyID
INNER JOIN #vmDW vd ON vd.VMName=vs.VMId
LEFT JOIN (SELECT ManagedEntityRowId,AVG(AverageValue) AverageValue FROM #rawdata GROUP BY ManagedEntityRowId) r ON vd.ManagedEntityId=r.ManagedEntityRowId
ORDER BY dataCreated.[Value] DESC
END TRY
BEGIN CATCH
if object_id('tempdb..#VMSnapshots') IS NOT NULL drop table #VMSnapshots
if object_id('tempdb..#NewVMSnapshotObj') IS NOT NULL drop table #NewVMSnapshotObj
IF (@@TRANCOUNT &gt; 0)
ROLLBACK TRAN

SELECT
@ErrorNumber = ERROR_NUMBER()
,@ErrorSeverity = ERROR_SEVERITY()
,@ErrorState = ERROR_STATE()
,@ErrorLine = ERROR_LINE()
,@ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-')
,@ErrorMessageText = ERROR_MESSAGE()

END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_VMSnapshotGet] TO OpsMgrReader
GO
</Install>
<Uninstall>-- ##### Veeam_GRL_CurrentSummaryGetByScope_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_CurrentSummaryGetByScope')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_CurrentSummaryGetByScope]')
END
GO
-- ##### Veeam_GRL_DefaultObjectListGetByReport_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_DefaultObjectListGetByReport')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_DefaultObjectListGetByReport]')
END
GO
-- ##### Veeam_GRL_SortModesGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_SortModesGet')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_SortModesGet]')
END
GO
-- ##### Veeam_GRL_RelationTypePartiesGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_RelationTypePartiesGet')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_RelationTypePartiesGet]')
END
GO
-- ##### Veeam_GRL_RelationTypesGetByScope_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_RelationTypesGetByScope')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_RelationTypesGetByScope]')
END
GO
-- ##### Veeam_GRL_RelationHistoryGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_RelationHistoryGet')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_RelationHistoryGet]')
END
GO
-- ##### Veeam_GRL_ReportDetailsGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ReportDetailsGet')
BEGIN
DROP PROCEDURE dbo.[Veeam_GRL_ReportDetailsGet]
END
GO
-- ##### Veeam_GRL_StateDetailsGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_StateDetailsGet')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_StateDetailsGet]')
END
GO
-- ##### Veeam_GRL_StateGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_StateGet')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_StateGet]')
END
GO
-- ##### Veeam_GRL_ManagedEntityTypesGetByScope_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ManagedEntityTypesGetByScope')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_ManagedEntityTypesGetByScope]')
END
GO
-- ##### Veeam_GRL_ManagedEntityTypesGetByReport_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ManagedEntityTypesGetByReport')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_ManagedEntityTypesGetByReport]')
END
GO
-- ##### Veeam_GRL_MonitorsGetByManagedEntityType_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_MonitorsGetByManagedEntityType')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_MonitorsGetByManagedEntityType]')
END
GO
-- ##### Veeam_GRL_AlertHistoryGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_AlertHistoryGet')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_AlertHistoryGet]')
END
GO
-- ##### Veeam_GRL_AlertStatsGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_AlertStatsGet')
BEGIN
DROP PROCEDURE dbo.[Veeam_GRL_AlertStatsGet]
END
GO
-- ##### Veeam_GRL_InstanceListGetSelected_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_InstanceListGetSelected')
BEGIN
DROP PROCEDURE dbo.[Veeam_GRL_InstanceListGetSelected]
END
GO
-- ##### Veeam_GRL_ManagementGroupsGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ManagementGroupsGet')
BEGIN
DROP PROCEDURE dbo.[Veeam_GRL_ManagementGroupsGet]
END
GO
-- ##### Veeam_GRL_ObjectListGetSelected_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ObjectListGetSelected')
BEGIN
DROP PROCEDURE dbo.[Veeam_GRL_ObjectListGetSelected]
END
GO
-- ##### Veeam_GRL_PerformanceChartModeGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceChartModeGet')
BEGIN
DROP PROCEDURE dbo.[Veeam_GRL_PerformanceChartModeGet]
END
GO
-- ##### Veeam_GRL_PerformanceGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceGet')
BEGIN
DROP PROCEDURE dbo.[Veeam_GRL_PerformanceGet]
END
GO
-- ##### Veeam_GRL_PerformanceRuleGetByReport_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceRuleGetByReport')
BEGIN
DROP PROCEDURE dbo.[Veeam_GRL_PerformanceRuleGetByReport]
END
GO
-- ##### Veeam_GRL_PerformanceSectionModeGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceSectionModeGet')
BEGIN
DROP PROCEDURE dbo.[Veeam_GRL_PerformanceSectionModeGet]
END
GO
-- ##### Veeam_GRL_PerformanceTopGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceTopGet')
BEGIN
DROP PROCEDURE dbo.[Veeam_GRL_PerformanceTopGet]
END
GO
-- ##### Veeam_GRL_ReportDetailsGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ReportDetailsGet')
BEGIN
DROP PROCEDURE dbo.[Veeam_GRL_ReportDetailsGet]
END
GO
-- ##### Veeam_GRL_RulesGetSelected_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_RulesGetSelected')
BEGIN
DROP PROCEDURE dbo.[Veeam_GRL_RulesGetSelected]
END
GO
-- ##### Veeam_GRL_ObjectListGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ObjectListGet')
BEGIN
DROP PROCEDURE dbo.[Veeam_GRL_ObjectListGet]
END
GO
-- ##### Veeam_GRL_CheckServiceAvailability_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_CheckServiceAvailability')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_CheckServiceAvailability]')
END
GO
-- ##### Veeam_GRL_PropertiesGetByScope_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PropertiesGetByScope')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_PropertiesGetByScope]')
END
GO
-- ##### Veeam_GRL_VMSnapshotGet_Drop.sql
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_VMSnapshotGet')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.[Veeam_GRL_VMSnapshotGet]')
END
GO
</Uninstall>
<Upgrade>-- ##### Veeam_GRL_TABLES_Create.sql

IF OBJECT_ID('dbo.Veeam_GRL_Report') IS NULL
BEGIN
CREATE TABLE dbo.Veeam_GRL_Report
(
ReportId INT NOT NULL IDENTITY,
ReportSystemName NVARCHAR(256) NOT NULL,
ReportDisplayName NVARCHAR(512) NOT NULL,
ReportDescription NVARCHAR(MAX) NULL,
ReportTargetManagementEntityTypeSystemName NVARCHAR(256) NULL,
LinkedInd BIT,
BaseReportId INT NULL,
MPSystemName NVARCHAR(512) NOT NULL,
Options XML NULL,
CONSTRAINT PK_Veeam_GRL_Report PRIMARY KEY (ReportId),
CONSTRAINT AK_Veeam_GRL_Report__ReportSystemName UNIQUE (ReportSystemName),
CONSTRAINT FK_Veeam_GRL_Report__Veeam_GRL_Report FOREIGN KEY (BaseReportId) REFERENCES [dbo].[Veeam_GRL_Report] (ReportId)
)
END
ELSE IF NOT EXISTS (
SELECT *
FROM
sys.objects o
INNER JOIN sys.schemas s ON s.[schema_id] = o.[schema_id]
INNER JOIN sys.[columns] c ON c.[object_id]=o.[object_id]
WHERE
s.name='dbo'
AND o.name='Veeam_GRL_Report'
AND c.name='Options'
AND o.[type]='U'
)
BEGIN
ALTER TABLE dbo.Veeam_GRL_Report
ADD Options XML NULL
END

IF OBJECT_ID('dbo.Veeam_GRL_MeasurementUnit') IS NULL
BEGIN
CREATE TABLE dbo.Veeam_GRL_MeasurementUnit
(
MeasurementUnitId INT NOT NULL IDENTITY,
MeasurementUnitName NVARCHAR(256),
CONSTRAINT PK_Veeam_GRL_MeasurementUnit PRIMARY KEY(MeasurementUnitId),
CONSTRAINT AK_Veeam_GRL_MeasurementUnit__MeasurementUnitName UNIQUE (MeasurementUnitName)
)
END

IF OBJECT_ID('dbo.Veeam_GRL_PerformanceRule') IS NULL
BEGIN
CREATE TABLE dbo.Veeam_GRL_PerformanceRule
(
PerformanceRuleId INT NOT NULL IDENTITY,
RuleSystemName NVARCHAR(256) NOT NULL,
MeasurementUnitId INT NOT NULL,
DefaultAggregationFunction VARCHAR(10) NOT NULL,
DefaultScale FLOAT NOT NULL DEFAULT 1.0,
HiddenInd BIT NOT NULL DEFAULT 0,
URL NVARCHAR(MAX) NULL,
ParentPerformanceRuleId INT NULL,
MPSystemName NVARCHAR(512) NOT NULL,
CONSTRAINT PK_Veeam_GRL_PerformanceRule PRIMARY KEY(PerformanceRuleId),
CONSTRAINT FK_Veeam_GRL_PerformanceRule__Veeam_GRL_MeasurementUnit FOREIGN KEY (MeasurementUnitId) REFERENCES Veeam_GRL_MeasurementUnit(MeasurementUnitId),
CONSTRAINT FK_Veeam_GRL_PerformanceRule__Veeam_GRL_PerformanceRule FOREIGN KEY (ParentPerformanceRuleId) REFERENCES Veeam_GRL_PerformanceRule(PerformanceRuleId)
)
END
ELSE IF NOT EXISTS (
SELECT *
FROM
sys.objects o
INNER JOIN sys.schemas s ON s.[schema_id] = o.[schema_id]
INNER JOIN sys.[columns] c ON c.[object_id]=o.[object_id]
WHERE
s.name='dbo'
AND o.name='Veeam_GRL_PerformanceRule'
AND c.name='URL'
AND o.[type]='U'
)
BEGIN
ALTER TABLE dbo.Veeam_GRL_PerformanceRule
ADD [URL] NVARCHAR(MAX) NULL
END


IF OBJECT_ID('dbo.Veeam_GRL_ReportPerformanceRule') IS NULL
BEGIN
CREATE TABLE dbo.Veeam_GRL_ReportPerformanceRule
(
PerformanceReportRuleId INT NOT NULL IDENTITY,
ReportId INT NOT NULL,
PerformanceRuleId INT NOT NULL,
MPSystemName NVARCHAR(512) NOT NULL,
CONSTRAINT PK_Veeam_GRL_PerformanceReportRule PRIMARY KEY (PerformanceReportRuleId),
CONSTRAINT FK_Veeam_GRL_PerformanceReportRule__Veeam_GRL_Report FOREIGN KEY (ReportId) REFERENCES [dbo].[Veeam_GRL_Report] (ReportId),
CONSTRAINT FK_Veeam_GRL_ReportPerformanceRule__Veeam_GRL_PerformanceRule FOREIGN KEY (PerformanceRuleId) REFERENCES [dbo].[Veeam_GRL_PerformanceRule] (PerformanceRuleId),
CONSTRAINT AK_Veeam_GRL_ReportPerformanceRule__ReportId_PerformanceRuleId UNIQUE (ReportId,PerformanceRuleId)
)
END

IF OBJECT_ID('dbo.Veeam_GRL_ColorCode') IS NULL
BEGIN
CREATE TABLE dbo.Veeam_GRL_ColorCode
(
ColorCodeRowId INT NOT NULL,
ColorCode NVARCHAR(64) NOT NULL,
CONSTRAINT PK_Veeam_GRL_ColorCode PRIMARY KEY (ColorCodeRowId)
)
END

GRANT SELECT ON dbo.Veeam_GRL_Report TO OpsMgrReader
GRANT SELECT ON dbo.Veeam_GRL_MeasurementUnit TO OpsMgrReader
GRANT SELECT ON dbo.Veeam_GRL_PerformanceRule TO OpsMgrReader
GRANT SELECT ON dbo.Veeam_GRL_ReportPerformanceRule TO OpsMgrReader
GRANT SELECT ON dbo.Veeam_GRL_ColorCode TO OpsMgrReader

----- temporary objects and data
IF OBJECT_ID('tempdb..#Veeam_GRL_Report') IS NOT NULL DROP TABLE #Veeam_GRL_Report

CREATE TABLE #Veeam_GRL_Report
(
ReportSystemName NVARCHAR(256) NOT NULL,
ReportDisplayName NVARCHAR(512) NOT NULL,
ReportDescription NVARCHAR(MAX) NULL,
ReportTargetManagementEntityTypeSystemName NVARCHAR(256) NULL,
LinkedInd BIT,
BaseReportId INT NULL,
MPSystemName NVARCHAR(512) NOT NULL,
Options XML NULL
)

----- Add reports

-- Generic performance report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericPerformance.report',
'Performance',
'The Veeam Performance Report is a generic report that aggregates historical data and shows performance counter values for selected infrastructure objects over time. This report extends the functionality of the Microsoft Generic Report library by adding the following advanced features: showing group, object and performance counter instance average values on the chart, showing daily/hourly values in the report table.',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic performance detail report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericPerformanceDetail.report',
'Performance Details',
'The Veeam Performance Details Report is a generic report that aggregates historical data and shows performance counter values for selected infrastructure objects over time. This report extends the functionality of the Microsoft Generic Report library by adding the following advanced features: showing performance trend, drilling-down to data collected for specific objects/performance counter instances included into the report scope.',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic top/bottom report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericPerformanceTopBottom.report',
'Performance Top (Bottom) N',
'The Veeam Performance Top (Bottom) N Report is a generic report that aggregates historical performance data and shows top (or bottom) N infrastructure objects, performance counter instances or both for a specific performance counter rule. This report extends the functionality of the Microsoft Generic Report library by adding the following advanced features: including objects and/or instances into the report scope, advanced grouping and sorting options, daily and hourly levels of data aggregation.',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic alert stats report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericAlertStats.report',
'Alert Statistics',
'The Veeam Alert Statistics Report is a generic report that shows the alerting activity for given filter parameters. This report extends the functionality of the Microsoft Generic Report library by adding the following advanced features: showing per-rule/monitor and per-object alert statistics, providing two levels of detail, comparing the alerting activity for two time intervals and management pack selection.',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic alert history report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericAlertHistory.report',
'Alert History',
'The Veeam Alert History Report provides information on alerts raised for infrastructure objects across a time range. This report helps you to review the health state of the environment for the specified time range in the past. The report details how many alerts with different severity and priority levels were raised on each day of the reporting period.',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic state report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName,
Options
)
VALUES
(
'Veeam.Report.Library.GenericState.report',
'State Summary',
'The Veeam State Summary Report shows the time in healthy/unhealthy state for selected infrastructure objects'' monitor across a time range.',
0,
NULL,
'Veeam.Report.Library',
'&lt;SortModes&gt;
&lt;SortMode Value="D" Label="Object Type, Monitor and Object Names" /&gt;
&lt;SortMode Value="1ut" Label="1st Interval - Up Time" /&gt;
&lt;SortMode Value="1up" Label="1st Interval - Up Time %" /&gt;
&lt;SortMode Value="1dt" Label="1st Interval - Down Time" /&gt;
&lt;SortMode Value="1dp" Label="1st Interval - Down Time %" /&gt;
&lt;SortMode Value="2ut" Label="2nd Interval - Up Time" /&gt;
&lt;SortMode Value="2up" Label="2nd Interval - Up Time %" /&gt;
&lt;SortMode Value="2dt" Label="2nd Interval - Down Time" /&gt;
&lt;SortMode Value="2dp" Label="2nd Interval - Down Time %" /&gt;
&lt;SortMode Value="c" Label="Change (pp)" /&gt;
&lt;/SortModes&gt;'
)

-- Generic state details report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericStateDetails.report',
'State Details',
'The Veeam State Summary Report shows the time in healthy/unhealthy state for selected infrastructure objects'' monitor across a time range.',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic snapshot summar report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName
)
VALUES
(
'Veeam.Report.Library.GenericVMSnapshot.report',
'Snapshot Summary Generic Report',
'Generic report with grouped snapshot metadata for virtual machines',
0,
NULL,
'Veeam.Report.Library'
)

-- Generic relationship history report
INSERT INTO #Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
LinkedInd,
BaseReportId,
MPSystemName,
Options
)
VALUES
(
'Veeam.Report.Library.GenericRelationshipHistory.report',
'Relationship History',
'The Veeam Relationship History Report allows you to choose a specific type of relationship between infrastructure objects and track changes for this relationship over a time interval.',
0,
NULL,
'Veeam.Report.Library',
'&lt;RelationTypeParties&gt;&lt;RelationTypeParty Value="S" Label="Source" /&gt;&lt;RelationTypeParty Value="T" Label="Target" /&gt;&lt;RelationTypeParty Value="ST" Label="Both Source and Target" /&gt;&lt;/RelationTypeParties&gt;'
)

-- Update existing reports
UPDATE vgr
SET
ReportSystemName = r.ReportSystemName,
ReportDisplayName = r.ReportDisplayName,
ReportDescription = r.ReportDescription,
ReportTargetManagementEntityTypeSystemName = r.ReportTargetManagementEntityTypeSystemName,
LinkedInd = r.LinkedInd,
BaseReportId = r.BaseReportId,
MPSystemName = r.MPSystemName,
Options = r.Options
FROM
dbo.Veeam_GRL_Report vgr
INNER JOIN #Veeam_GRL_Report r ON r.ReportSystemName = vgr.ReportSystemName AND r.MPSystemName = vgr.MPSystemName

-- Insert new reports
INSERT dbo.Veeam_GRL_Report
(
ReportSystemName,
ReportDisplayName,
ReportDescription,
ReportTargetManagementEntityTypeSystemName,
LinkedInd,
BaseReportId,
MPSystemName,
Options
)
SELECT
r.ReportSystemName,
r.ReportDisplayName,
r.ReportDescription,
r.ReportTargetManagementEntityTypeSystemName,
r.LinkedInd,
r.BaseReportId,
r.MPSystemName,
r.Options
FROM
#Veeam_GRL_Report r
LEFT OUTER JOIN dbo.Veeam_GRL_Report vgr ON vgr.ReportSystemName = r.ReportSystemName AND vgr.MPSystemName = r.MPSystemName
WHERE
vgr.ReportId IS NULL

----- drop temporary objects
IF OBJECT_ID('tempdb..#Veeam_GRL_Report') IS NOT NULL DROP TABLE #Veeam_GRL_Report

----- Add color codes
DELETE FROM dbo.Veeam_GRL_ColorCode
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('139,0,0',1)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,100,0',2)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('153,50,204',3)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,0,139',4)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('255,165,0',5)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('178,34,34',6)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('46,139,87',7)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('75,0,130',8)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,0,205',9)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('255,215,0',10)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('220,20,60',11)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('60,179,113',12)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('128,0,128',13)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,0,255',14)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('255,255,0',15)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('255,0,0',16)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,255,127',17)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('72,61,139',18)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('65,105,225',19)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('189,183,107',20)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('255,69,0',21)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,250,154',22)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('148,0,211',23)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('100,149,237',24)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('205,92,92',25)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('50,205,50',26)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('255,0,255',27)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('30,144,255',28)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,255,0',29)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,191,255',30)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('173,255,47',31)
INSERT INTO dbo.Veeam_GRL_ColorCode (ColorCode, ColorCodeRowId) VALUES ('0,255,255',0)
GO
-- ##### Veeam_GRL_ObjectListGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ObjectListGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ObjectListGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_ObjectListGet]
@StartDate datetime,
@EndDate datetime, -- relationship should exist within @StartDate..@EndDate interval
@ObjectList XML, -- scope
@ForceContainment BIT = 0, -- disregard 'Self' option, always use containment
@ManagedEntityTypeRowId INT = NULL, -- output only objects of this type within the scope defined by @ObjectList
@MaxLevel INT = NULL, -- max nest level
@XPathType INT = 0, -- 0 - /Data/Objects/Object
-- 1 - /Data/Values/Value/Object
@HostedOnly BIT = 0, -- use only hosted relationship (subclass of containment)
@ManagedEntityTypeFilterRowId INT = NULL, -- All entities of specified type (when no scope is specified)
@XmlOutputOnly BIT = 0,
@OutputXml XML = NULL OUT
AS
BEGIN
BEGIN TRY
IF OBJECT_ID('tempdb..#ObjectList') IS NOT NULL DROP TABLE #ObjectList
IF OBJECT_ID('tempdb..#ContainmentObjectList') IS NOT NULL DROP TABLE #ContainmentObjectList
IF OBJECT_ID('tempdb..#RelationshipType') IS NOT NULL DROP TABLE #RelationshipType
IF OBJECT_ID('tempdb..#ObjectListGetResult') IS NOT NULL DROP TABLE #ObjectListGetResult

CREATE TABLE #ObjectList (
ManagedEntityRowId INT
)

CREATE TABLE #ContainmentObjectList (
ManagedEntityRowId int,
[Level] int
)

CREATE TABLE #RelationshipType (
RelationshipTypeRowId int,
[Level] int
)

CREATE TABLE #ObjectListGetResult (
ManagedEntityRowId INT
)

IF @ObjectList IS NOT NULL
BEGIN
IF @XPathType=1
BEGIN
INSERT INTO #ObjectList (ManagedEntityRowId)
SELECT ObjectList.ManagedEntityRowId.value('.', 'int')
FROM @ObjectList.nodes('/Data/Values/Value/Object') AS ObjectList(ManagedEntityRowId)
WHERE ISNULL(ObjectList.ManagedEntityRowId.value('@Use', 'nvarchar(255)'), 'Self') = 'Self'

INSERT INTO #ContainmentObjectList (ManagedEntityRowId, [Level])
SELECT ObjectList.ManagedEntityRowId.value('.', 'int'), 0
FROM @ObjectList.nodes('/Data/Values/Value/Object') AS ObjectList(ManagedEntityRowId)
WHERE ISNULL(ObjectList.ManagedEntityRowId.value('@Use', 'nvarchar(255)'), 'Self') = 'Containment' OR @ForceContainment = 1
END
ELSE
BEGIN
INSERT INTO #ObjectList (ManagedEntityRowId)
SELECT ObjectList.ManagedEntityRowId.value('.', 'int')
FROM @ObjectList.nodes('/Data/Objects/Object') AS ObjectList(ManagedEntityRowId)
WHERE ISNULL(ObjectList.ManagedEntityRowId.value('@Use', 'nvarchar(255)'), 'Self') = 'Self'

INSERT INTO #ContainmentObjectList (ManagedEntityRowId, [Level])
SELECT ObjectList.ManagedEntityRowId.value('.', 'int'), 0
FROM @ObjectList.nodes('/Data/Objects/Object') AS ObjectList(ManagedEntityRowId)
WHERE ISNULL(ObjectList.ManagedEntityRowId.value('@Use', 'nvarchar(255)'), 'Self') = 'Containment' OR @ForceContainment = 1
END
END
ELSE IF @ObjectList IS NULL AND @ManagedEntityTypeFilterRowId IS NOT NULL
BEGIN
INSERT INTO #ObjectList (ManagedEntityRowId)
SELECT vme.ManagedEntityRowId FROM [dbo].[vManagedEntity] vme WHERE vme.ManagedEntityTypeRowId=@ManagedEntityTypeFilterRowId

INSERT INTO #ContainmentObjectList (ManagedEntityRowId, [Level])
SELECT vme.ManagedEntityRowId, 0 FROM [dbo].[vManagedEntity] vme WHERE vme.ManagedEntityTypeRowId=@ManagedEntityTypeFilterRowId AND @ForceContainment = 1
END

IF EXISTS (SELECT TOP 1 1 FROM #ContainmentObjectList)
BEGIN
DECLARE @ContainmentRelationshipTypeRowId INT
DECLARE @RootRTSystemName NVARCHAR(MAX)

SET @RootRTSystemName = CASE WHEN @HostedOnly = 0 THEN N'System.Containment' ELSE N'System.Hosting' END

SELECT @ContainmentRelationshipTypeRowId = RelationshipTypeRowId FROM [dbo].[vRelationshipType] WHERE RelationshipTypeSystemName = @RootRTSystemName

INSERT #RelationshipType(RelationshipTypeRowId, [Level])
SELECT RelationshipTypeRowId, [Level]
FROM dbo.RelationshipDerivedTypeHierarchy(@ContainmentRelationshipTypeRowId, 0)

DECLARE @CurrentLevel INT, @RowCount INT
SET @CurrentLevel = 1
SET @RowCount = 1

WHILE @RowCount &gt; 0 AND @CurrentLevel&lt;=ISNULL(@MaxLevel,10000)
BEGIN
INSERT INTO #ContainmentObjectList (ManagedEntityRowId, [Level])
SELECT DISTINCT r.TargetManagedEntityRowId, @CurrentLevel
FROM [dbo].[Relationship] r
JOIN [dbo].[RelationshipManagementGroup] rmg ON (r.RelationshipRowId = rmg.RelationshipRowId)
JOIN #RelationshipType rt ON (r.RelationshipTypeRowId = rt.RelationshipTypeRowId)
JOIN #ContainmentObjectList me ON (me.ManagedEntityRowId = r.SourceManagedEntityRowId) AND (me.[Level] = @CurrentLevel - 1)
WHERE (rmg.FromDateTime &lt;= @EndDate OR @EndDate IS NULL) AND (ISNULL(rmg.ToDateTime, '99991231') &gt;= @StartDate OR @StartDate IS NULL)

SELECT @RowCount = @@ROWCOUNT
SET @CurrentLevel = @CurrentLevel + 1
END
END

INSERT INTO #ObjectListGetResult
(
ManagedEntityRowId
)
SELECT o.ManagedEntityRowId
FROM
#ObjectList o
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
WHERE vme.ManagedEntityTypeRowId=@ManagedEntityTypeRowId OR @ManagedEntityTypeRowId IS NULL

UNION

SELECT o.ManagedEntityRowId
FROM
#ContainmentObjectList o
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
WHERE
(vme.ManagedEntityTypeRowId=@ManagedEntityTypeRowId OR @ManagedEntityTypeRowId IS NULL)
AND
(o.[Level]&lt;=@MaxLevel OR @MaxLevel IS NULL)

IF @XmlOutputOnly=1
BEGIN
SET @OutputXml = (SELECT * FROM #ObjectListGetResult FOR XML PATH('Object'), ROOT('Objects'))
END
ELSE SELECT * FROM #ObjectListGetResult

IF OBJECT_ID('tempdb..#ObjectList') IS NOT NULL DROP TABLE #ObjectList
IF OBJECT_ID('tempdb..#ContainmentObjectList') IS NOT NULL DROP TABLE #ContainmentObjectList
IF OBJECT_ID('tempdb..#RelationshipType') IS NOT NULL DROP TABLE #RelationshipType
IF OBJECT_ID('tempdb..#ObjectListGetResult') IS NOT NULL DROP TABLE #ObjectListGetResult

END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#ObjectList') IS NOT NULL DROP TABLE #ObjectList
IF OBJECT_ID('tempdb..#ContainmentObjectList') IS NOT NULL DROP TABLE #ContainmentObjectList
IF OBJECT_ID('tempdb..#RelationshipType') IS NOT NULL DROP TABLE #RelationshipType
IF OBJECT_ID('tempdb..#ObjectListGetResult') IS NOT NULL DROP TABLE #ObjectListGetResult

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ObjectListGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_RulesGetSelected_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_RulesGetSelected')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_RulesGetSelected] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_RulesGetSelected]
@Rules XML
AS
BEGIN
IF @Rules IS NOT NULL
BEGIN
SELECT
RuleName=vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+')'+
CASE WHEN mu.MeasurementUnitName IS NOT NULL THEN ' ['+mu.MeasurementUnitName+']' ELSE '' END,
pr.URL
FROM
[dbo].[vRule] vr
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
INNER JOIN @Rules.nodes('/Data/Values') AS Rules(RuleGuid) ON Rules.RuleGuid.value('.','UNIQUEIDENTIFIER')=vr.RuleGuid
LEFT OUTER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
LEFT OUTER JOIN [dbo].[Veeam_GRL_MeasurementUnit] mu ON mu.MeasurementUnitId = pr.MeasurementUnitId
ORDER BY 1
END
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_RulesGetSelected] TO OpsMgrReader
GO
-- ##### Veeam_GRL_ObjectListGetSelected_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ObjectListGetSelected')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ObjectListGetSelected] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_ObjectListGetSelected]
@ObjectList XML,
@XPathType INT = 0
AS
BEGIN
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj

CREATE TABLE #obj
(
ManagedEntityRowId INT
)

INSERT INTO #obj
(
ManagedEntityRowId
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = null,
@EndDate = null,
@ObjectList = @ObjectList,
@ForceContainment = 0,
@ManagedEntityTypeRowId = null,
@MaxLevel = 0,
@XPathType = @XPathType

SELECT
FullName = vmg.ManagementGroupDefaultName + '\'+
CASE WHEN vme.[Path] IS NOT NULL THEN vme.[Path]+'\' ELSE '' END+
vme.DisplayName,
vmeti.[Image]
FROM
#obj o
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagementGroup] vmg ON vmg.ManagementGroupRowId = vme.ManagementGroupRowId
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] vmeti ON (vmeti.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId AND vmeti.ImageCategory = N'u16x16Icon')

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ObjectListGetSelected] TO OpsMgrReader
GO
-- ##### Veeam_GRL_InstanceListGetSelected_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_InstanceListGetSelected')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_InstanceListGetSelected] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_InstanceListGetSelected]
@RuleId UNIQUEIDENTIFIER,
@InstanceList XML = NULL
AS
BEGIN
IF ISNULL(convert(nvarchar(max),@InstanceList),'')=''
BEGIN
SELECT InstanceName='ALL'
END
ELSE
BEGIN
SELECT DISTINCT
vpri.InstanceName
FROM
[dbo].[vRule] vr
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.RuleRowId = vpr.RuleRowId
INNER JOIN @InstanceList.nodes('/Data/Values') AS InstanceList(InstanceName) ON
InstanceList.InstanceName.value('.', 'nvarchar(256)') = vpri.InstanceName
END
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_InstanceListGetSelected] TO OpsMgrReader
GO
-- ##### Veeam_GRL_ManagementGroupsGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ManagementGroupsGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ManagementGroupsGet] AS RETURN 1')
END
GO

ALTER PROCEDURE [dbo].[Veeam_GRL_ManagementGroupsGet]
@ShowAllMGs TINYINT = 0
AS
SELECT ManagementGroupGuid, ManagementGroupDefaultName
FROM [dbo].[vManagementGroup]
WHERE ((NOT (ConnectConfirmedDateTime IS NULL)) AND (ConnectRejectedind = 0)) OR @ShowAllMGs&gt;0
ORDER BY ManagementGroupDefaultName
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ManagementGroupsGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_PerformanceChartModeGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceChartModeGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_PerformanceChartModeGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_PerformanceChartModeGet]
@SectionMode CHAR(1),
@ReportSystemName NVARCHAR(256)=NULL
AS
BEGIN

SELECT Id, NAME
FROM
(
SELECT Id=0, NAME='Native', SectionMode='N'
UNION ALL
--SELECT 1, 'Instance', 'GOC'
--UNION ALL
SELECT 2, 'Counter', 'GO'
UNION ALL
SELECT 3, 'Counters that have the same measurement unit', 'GO'
UNION ALL
SELECT 4, 'Counters that have the same measurement unit and collected for the same target', 'G'
UNION ALL
SELECT
5, vmet.ManagedEntityTypeDefaultName, 'C'
FROM
[dbo].[Veeam_GRL_Report] r
INNER JOIN [dbo].[vManagedEntityType] vmet ON r.ReportTargetManagementEntityTypeSystemName=vmet.ManagedEntityTypeSystemName
WHERE r.ReportSystemName=@ReportSystemName
UNION ALL
SELECT 6, 'Selected Group/Object', 'C'
UNION ALL
SELECT 7, 'All objects', 'C'
) X
WHERE SectionMode LIKE '%'+@SectionMode+'%'

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_PerformanceChartModeGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_PerformanceRuleGetByReport_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceRuleGetByReport')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_PerformanceRuleGetByReport] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_PerformanceRuleGetByReport]
@ReportSystemName NVARCHAR(256)
AS
BEGIN
IF EXISTS (
SELECT TOP 1 1
FROM
dbo.Veeam_GRL_ReportPerformanceRule rpr
INNER JOIN dbo.Veeam_GRL_Report r ON r.ReportId = rpr.ReportId
INNER JOIN dbo.Veeam_GRL_PerformanceRule pr ON pr.PerformanceRuleId = rpr.PerformanceRuleId
INNER JOIN dbo.vRule vr ON pr.RuleSystemName=vr.RuleSystemName
INNER JOIN dbo.vPerformanceRule vpr ON vpr.RuleRowId = vr.RuleRowId
WHERE r.ReportSystemName=@ReportSystemName
)
BEGIN

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

CREATE TABLE #r
(
PerformanceRuleId INT,
RuleDefaultName NVARCHAR(256),
ObjectCounterName NVARCHAR(MAX),
ObjectCounterDisplayName NVARCHAR(MAX),
RuleGuid UNIQUEIDENTIFIER,
DefaultAggregationFunction VARCHAR(10),
IsHidden BIT,
RuleRank INT
)


INSERT INTO #r
(
PerformanceRuleId,
RuleDefaultName,
ObjectCounterName,
ObjectCounterDisplayName,
RuleGuid,
DefaultAggregationFunction,
IsHidden
)
SELECT
pr.PerformanceRuleId,
vr.RuleDefaultName,
ObjectCounterName=vpr.ObjectName+'\'+vpr.CounterName,
ObjectCounterDisplayName=vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+')',
vr.RuleGuid,
pr.DefaultAggregationFunction,
IsHidden = pr.HiddenInd
FROM
dbo.Veeam_GRL_ReportPerformanceRule rpr
INNER JOIN dbo.Veeam_GRL_Report r ON r.ReportId = rpr.ReportId
INNER JOIN dbo.Veeam_GRL_PerformanceRule pr ON pr.PerformanceRuleId = rpr.PerformanceRuleId
INNER JOIN dbo.vRule vr ON pr.RuleSystemName=vr.RuleSystemName
INNER JOIN dbo.vPerformanceRule vpr ON vpr.RuleRowId = vr.RuleRowId
WHERE r.ReportSystemName=@ReportSystemName

UPDATE r
SET RuleRank = x.RuleRank
FROM
#r r
INNER JOIN
(
SELECT
r.RuleGuid,
RuleRank = ROW_NUMBER() OVER (PARTITION BY r.ObjectCounterName ORDER BY r.IsHidden, r.PerformanceRuleId)
FROM
#r r
) x ON r.RuleGuid=x.RuleGuid

SELECT DISTINCT
PerformanceRuleId,
RuleDefaultName,
ObjectCounterName = ObjectCounterDisplayName,
RuleGuid,
DefaultAggregationFunction
FROM #r
--WHERE RuleRank=1
ORDER BY ObjectCounterDisplayName

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

END
ELSE BEGIN
SELECT
PerformanceRuleId=-1,
RuleDefaultName='Counters are not available yet. Probably data is not collected yet.',
ObjectCounterName='Counters are not available. Probably data is not collected yet.',
RuleGuid='00000000-0000-0000-0000-000000000000',
DefaultAggregationFunction='Avg'
END
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_PerformanceRuleGetByReport] TO OpsMgrReader
GO
-- ##### Veeam_GRL_PerformanceSectionModeGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceSectionModeGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_PerformanceSectionModeGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_PerformanceSectionModeGet]
@ReportMode CHAR(1),
@ReportSystemName NVARCHAR(256)=NULL
AS
BEGIN
SELECT X.Id, X.NAME
FROM
(
SELECT Id='N', NAME='Native', ReportMode='N'
UNION ALL
SELECT
Id='O',
NAME=vmet.ManagedEntityTypeDefaultName,
ReportMode='L'
FROM
[dbo].[Veeam_GRL_Report] r
INNER JOIN [dbo].[vManagedEntityType] vmet ON r.ReportTargetManagementEntityTypeSystemName=vmet.ManagedEntityTypeSystemName
WHERE r.ReportSystemName=@ReportSystemName
UNION ALL
SELECT Id='G', NAME='Selected Group/Object', ReportMode='L'
UNION ALL
SELECT Id='C', NAME='Counter', ReportMode='L'
) X
WHERE x.ReportMode=@ReportMode
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_PerformanceSectionModeGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_ReportDetailsGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ReportDetailsGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ReportDetailsGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_ReportDetailsGet]
@ReportSystemName NVARCHAR(256)
AS
BEGIN
IF EXISTS(SELECT TOP 1 1 FROM [dbo].[Veeam_GRL_Report] r WHERE r.ReportSystemName=@ReportSystemName)
SELECT
ReportDefaultName = r.ReportDisplayName,
ReportDefaultDescription = CASE WHEN len(isnull(r.ReportDescription,''))&gt;0 THEN r.ReportDescription ELSE 'Description for this report is not available.' END,
MPSystemName = vmp.ManagementPackSystemName,
MPName = Replace(isnull(vmp.ManagementPackDefaultName,''),'Veeam ','')
FROM
[dbo].[Veeam_GRL_Report] r LEFT OUTER JOIN
[dbo].[vManagementPack] vmp ON r.MPSystemName=vmp.ManagementPackSystemName
WHERE r.ReportSystemName=@ReportSystemName
ELSE
SELECT
ReportDefaultName = 'Generic Report',
ReportDefaultDescription = 'Veeam generic report',
MPSystemName = vmp.ManagementPackSystemName,
MPName = Replace(vmp.ManagementPackDefaultName,'Veeam ','')
FROM
[dbo].[vManagementPack] vmp
WHERE vmp.ManagementPackSystemName='Veeam.Report.Library'
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ReportDetailsGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_PerformanceGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_PerformanceGet] AS RETURN 1')
END
GO

ALTER PROCEDURE [dbo].[Veeam_GRL_PerformanceGet]
@dtStart DATETIME,
@dtEnd DATETIME,
@config XML,
@DataAgg TINYINT, -- 1 - Daily, 0 - Hourly
@ReportId NVARCHAR(256) = NULL,
@DataMode VARCHAR(16) = 'GOI',
@SectionMode CHAR(1) = 'N', -- see [Veeam_GRL_PerformanceSectionModeGet]
@ChartMode INT = 0, -- see [Veeam_GRL_PerformanceChartModeGet]
@counters XML = NULL,
@Histogram INT = 0,
@instances XML = NULL,
@enableTrendCalc BIT = 1,
@enableMergeTweek BIT = 1,
@XmlOutputOnly BIT = 0,
@OutputXml XML = NULL OUT
AS
BEGIN
SET NOCOUNT ON

DECLARE @xmldoc_config INT,
@xmldoc_counters INT,
@RowCount INT,
@XmlTrend XML

BEGIN TRY
IF OBJECT_ID('tempdb..#section') IS NOT NULL
DROP TABLE #section

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

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

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

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

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

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

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

CREATE TABLE #section
(
SectionNo INT,
SectionTitle NVARCHAR(max)
)

CREATE TABLE #chart
(
SectionNo INT,
ChartNo INT,
ChartName NVARCHAR(max)
)

CREATE TABLE #seriesGroup
(
ChartNo INT NULL, -- Chart #
[Group] INT, -- native Chart # (Chart XML Node Id)
GroupTitle NVARCHAR(max), -- native Chart title
SeriesGroupNo INT, -- Series # (Series XML Node Id)
ChartScale FLOAT,
ChartType NVARCHAR(255),
ChartColor NVARCHAR(255),
OptionXml XML
)

-- Managed Entities to be used
CREATE TABLE #obj
(
ManagedEntityRowId INT,
SeriesGroupNo INT -- Series # (Series XML Node Id)
)

-- Groups and MEs contained in groups
CREATE TABLE #objGr
(
ManagedEntityRowId INT,
SeriesGroupNo INT,
[Level] INT -- Series # (Series XML Node Id)
)

-- containment relationships
CREATE TABLE #relType
(
RelationshipTypeRowId INT,
[Level] INT
)

-- counter instances (rule instances)
CREATE TABLE #counterInst
(
PerformanceRuleInstanceRowId INT,
PerformanceRuleRowId INT,
InstanceName NVARCHAR(256),
AggFunction VARCHAR(10),
SeriesGroupNo INT, -- Series # (Series XML Node Id)
ParentPerformanceRuleInstanceRowId INT,
ParentPerformanceRuleRowId INT,
MergeCandidateInd BIT DEFAULT 0
)

--raw values
CREATE TABLE #rawValues
(
[RuleRowId] INT,
[PerformanceRuleInstanceRowId] INT,
[ParentRuleRowId] INT,
[ParentPerformanceRuleInstanceRowId] INT,
[InstanceName] NVARCHAR(512),
[ManagedEntityRowId] INT,
[RawManagedEntityRowId] INT,
[TopLevelHostManagedEntityRowId] INT,
[DateTime] DATETIME,
[SampleCount] INT,
[AverageValue] FLOAT,
[MinValue] FLOAT,
[MaxValue] FLOAT,
[StandardDeviation] FLOAT,
[MergeCandidateInd] BIT DEFAULT 0
)

-- final values
CREATE TABLE #values
(
[RowId] INT IDENTITY PRIMARY KEY,
[SectionNo] INT,
[SectionTitle] NVARCHAR(255),
[ChartNo] INT,
[ChartTitle] NVARCHAR(255),
[SeriesGroupNo] INT,
[ChartScale] FLOAT,
[ChartType] NVARCHAR(510),
[ChartColor] NVARCHAR(510),
[RandomColor] NVARCHAR(510),
[ManagementGroupGuid] UNIQUEIDENTIFIER,
[ManagementGroupDefaultName] NVARCHAR(512),
[ManagedEntityTypeDefaultName] NVARCHAR(512),
[Image] VARBINARY(MAX),
[ManagedEntityRowId] INT,
[RawManagedEntityRowId] INT,
[ManagedEntityGuid] UNIQUEIDENTIFIER,
[Path] NVARCHAR(MAX),
[ManagedEntityFullName] NVARCHAR(MAX),
[ManagedEntityDefaultName] NVARCHAR(MAX),
[RuleRowId] INT,
[RuleGuid] UNIQUEIDENTIFIER,
[RuleDefaultName] NVARCHAR(512),
[RuleUrl] NVARCHAR(MAX),
[MeasurementUnitName] NVARCHAR(256),
[AggFunction] VARCHAR(10),
[MultiInstanceInd] BIT,
[ObjectName] NVARCHAR(512),
[CounterName] NVARCHAR(512),
[InstanceName] NVARCHAR(512),
[ObjInstNo] INT,
[ValueNo] BIGINT,
[ValueLabel] NVARCHAR(512),
[DateTime] DATETIME,
[TimeToNextValue] INT,
[SampleCount] INT,
[AverageValue] FLOAT,
[SumAvgValue] FLOAT,
[MinValue] FLOAT,
[MaxMinValue] FLOAT,
[SumMinValue] FLOAT,
[MaxValue] FLOAT,
[MinMaxValue] FLOAT,
[SumMaxValue] FLOAT,
[SumValue] FLOAT,
[StandardDeviation] FLOAT,
[RowType] CHAR(1), -- I - instance values, O - managed entity average, G - series (group) average,
[OptionXml] XML,
[TrendValue_Avg] FLOAT,
[TrendValue_SumAvg] FLOAT,
[TrendValue_Min] FLOAT,
[TrendValue_MaxMin] FLOAT,
[TrendValue_SumMin] FLOAT,
[TrendValue_Max] FLOAT,
[TrendValue_MinMax] FLOAT,
[TrendValue_SumMax] FLOAT,
[TrendValue_Sum] FLOAT,
[StandalonePointInd] TINYINT DEFAULT 0
)

EXEC sp_xml_preparedocument @xmldoc_config OUTPUT, @config

-- get group targets
INSERT INTO #objGr
(ManagedEntityRowId, SeriesGroupNo, [Level])
SELECT
ManagedEntityRowId,
SeriesGroupNo,
0
FROM
OPENXML(@xmldoc_config, '/Data/Values/Value/Object', 2) WITH
(
ManagedEntityRowId INT 'text()',
SeriesGroupNo INT '@mp:parentid',
[Use] NVARCHAR(255) '@Use'
) AS ObjectList
WHERE
ISNULL([Use], 'Self') = 'Containment' OR @SectionMode&lt;&gt;'N'

IF @@ROWCOUNT &gt; 0
BEGIN
DECLARE @ContainmentRelTypeId INT
SELECT
@ContainmentRelTypeId = RelationshipTypeRowId
FROM
[dbo].[vRelationshipType]
WHERE
RelationshipTypeSystemName = 'System.Containment'

-- find all relationship types derived from System.Containment
INSERT INTO #relType
(RelationshipTypeRowId, [Level])
SELECT
RelationshipTypeRowId,
[Level]
FROM
dbo.RelationshipDerivedTypeHierarchy(@ContainmentRelTypeId, 0)

SELECT
@RowCount = @@ROWCOUNT


DECLARE @CurrentLevel INT
SET @CurrentLevel = 1

-- get all managed entities contained in group targets
WHILE (@RowCount &gt; 0)
BEGIN
INSERT INTO #objGr
(ManagedEntityRowId, SeriesGroupNo, [Level])
SELECT
DISTINCT r.TargetManagedEntityRowId,
me.SeriesGroupNo,
@CurrentLevel
FROM
[dbo].[Relationship] r
JOIN [dbo].[RelationshipManagementGroup] rmg ON (r.RelationshipRowId = rmg.RelationshipRowId)
JOIN #relType rt ON (r.RelationshipTypeRowId = rt.RelationshipTypeRowId)
JOIN #objGr me ON (me.ManagedEntityRowId = r.SourceManagedEntityRowId) AND (me.[Level] = @CurrentLevel - 1)
WHERE
(rmg.FromDateTime &lt;= @dtEnd)
AND (ISNULL(rmg.ToDateTime, '99991231') &gt;= @dtStart)

SELECT
@RowCount = @@ROWCOUNT

SET @CurrentLevel = @CurrentLevel + 1
END
END

-- final targets list
INSERT INTO #obj
(ManagedEntityRowId, SeriesGroupNo)
SELECT
ManagedEntityRowId,
SeriesGroupNo
FROM
OPENXML(@xmldoc_config, '/Data/Values/Value/Object', 2) WITH
(
ManagedEntityRowId INT 'text()',
SeriesGroupNo INT '@mp:parentid',
[Use] NVARCHAR(255) '@Use'
) AS ObjectList
WHERE
ISNULL([Use], 'Self') = 'Self' AND @SectionMode='N'
UNION
SELECT
ManagedEntityRowId,
SeriesGroupNo
FROM
#objGr

-- final instance list
IF @SectionMode='N'
BEGIN
-- explicit instance list from config
INSERT INTO #counterInst
(PerformanceRuleInstanceRowId, InstanceName, SeriesGroupNo)
SELECT
pri.PerformanceRuleInstanceRowId,
pri.InstanceName,
i.SeriesGroupNo
FROM
OPENXML(@xmldoc_config, '/Data/Values/Value/Instance', 2) WITH
(
RuleGuid UNIQUEIDENTIFIER '../Rule',
InstanceName NVARCHAR(256) 'text()',
SeriesGroupNo INT '@mp:parentid'
) AS i
INNER JOIN [dbo].[vRule] r ON (r.RuleGuid = i.RuleGuid)
INNER JOIN [dbo].[vPerformanceRuleInstance] pri ON (r.RuleRowId = pri.RuleRowId)
AND pri.InstanceName LIKE ISNULL(i.InstanceName,'%')
UNION ALL
-- all instances (no instance list in config)
SELECT
pri.PerformanceRuleInstanceRowId,
pri.InstanceName,
i.SeriesGroupNo
FROM
OPENXML(@xmldoc_config, '/Data/Values/Value', 2) WITH
(
RuleGuid UNIQUEIDENTIFIER 'Rule',
SeriesGroupNo INT '@mp:id'
) AS i
INNER JOIN [dbo].[vRule] r ON (r.RuleGuid = i.RuleGuid)
INNER JOIN [dbo].[vPerformanceRuleInstance] pri ON (r.RuleRowId = pri.RuleRowId)
WHERE
i.SeriesGroupNo NOT IN (SELECT SeriesGroupNo FROM OPENXML(@xmldoc_config, '/Data/Values/Value/Instance', 2) WITH(SeriesGroupNo INT '@mp:parentid'))
END
ELSE IF @counters IS NOT NULL
BEGIN
EXEC sp_xml_preparedocument @xmldoc_counters OUTPUT, @counters

DECLARE @nwRules TABLE (RuleId INT)

-- recode Rule GUIDs to Veeam rule IDs
INSERT @nwRules (RuleId)
SELECT
pr.PerformanceRuleId
FROM
[dbo].[vRule] vr
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
INNER JOIN
OPENXML(@xmldoc_counters, '/root/Data/Values', 2) WITH
(
RuleGuid UNIQUEIDENTIFIER 'text()'
) AS i ON vr.RuleGuid=i.RuleGuid
INNER JOIN dbo.vPerformanceRule AS vpr ON vr.RuleRowId=vpr.RuleRowId
INNER JOIN
OPENXML(@xmldoc_counters, '/root/Label/Data/Values', 2) WITH
(
ObjectCounterName NVARCHAR(512) 'text()'
) AS i1 ON vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+')'=i1.ObjectCounterName

INSERT INTO #counterInst
(
PerformanceRuleInstanceRowId,
PerformanceRuleRowId,
InstanceName,
SeriesGroupNo
)
SELECT
vpri.PerformanceRuleInstanceRowId, vpri.RuleRowId, vpri.InstanceName, vr.RuleRowId
FROM
[dbo].[vPerformanceRuleInstance] vpri
INNER JOIN [dbo].[vRule] vr ON vr.RuleRowId = vpri.RuleRowId
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
INNER JOIN @nwRules i ON pr.PerformanceRuleId=i.RuleId
INNER JOIN dbo.vPerformanceRule AS vpr ON vr.RuleRowId=vpr.RuleRowId
INNER JOIN
OPENXML(@xmldoc_counters, '/root/Label/Data/Values', 2) WITH
(
ObjectCounterName NVARCHAR(512) 'text()'
) AS i1 ON vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+')'=i1.ObjectCounterName

IF @instances IS NOT NULL
BEGIN
DECLARE @nwInstances TABLE (InstanceName NVARCHAR(256))

INSERT @nwInstances (InstanceName)
SELECT DISTINCT InstanceList.InstanceName.value('.', 'nvarchar(256)')
FROM @instances.nodes('/Data/Values') AS InstanceList(InstanceName)

DELETE FROM #counterInst WHERE InstanceName NOT IN (SELECT InstanceName FROM @nwInstances)
END
END

IF @enableMergeTweek=1
BEGIN
INSERT INTO #counterInst
(
PerformanceRuleInstanceRowId,
InstanceName,
SeriesGroupNo
)
SELECT
pri.PerformanceRuleInstanceRowId,
pri.InstanceName,
ci.SeriesGroupNo
FROM
#counterInst ci
INNER JOIN [dbo].[vPerformanceRuleInstance] prip ON ci.PerformanceRuleInstanceRowId=prip.PerformanceRuleInstanceRowId
INNER JOIN [dbo].[vRule] vr ON prip.RuleRowId=vr.RuleRowId
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prp ON prp.RuleSystemName = vr.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prc ON prc.ParentPerformanceRuleId=prp.PerformanceRuleId
INNER JOIN [dbo].[vRule] vrc ON vrc.RuleSystemName = prc.RuleSystemName
INNER JOIN [dbo].[vPerformanceRuleInstance] pri ON pri.RuleRowId=vrc.RuleRowId AND ci.InstanceName=pri.InstanceName
LEFT OUTER JOIN #counterInst cidup ON ci.SeriesGroupNo=cidup.SeriesGroupNo AND pri.PerformanceRuleInstanceRowId=cidup.PerformanceRuleInstanceRowId
WHERE cidup.PerformanceRuleInstanceRowId IS NULL

INSERT INTO #counterInst
(
PerformanceRuleInstanceRowId,
InstanceName,
SeriesGroupNo
)
SELECT
pri.PerformanceRuleInstanceRowId,
pri.InstanceName,
ci.SeriesGroupNo
FROM
#counterInst ci
INNER JOIN [dbo].[vPerformanceRuleInstance] prip ON ci.PerformanceRuleInstanceRowId=prip.PerformanceRuleInstanceRowId
INNER JOIN [dbo].[vRule] vr ON prip.RuleRowId=vr.RuleRowId
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prp ON prp.RuleSystemName = vr.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prc ON prp.ParentPerformanceRuleId=prc.PerformanceRuleId
INNER JOIN [dbo].[vRule] vrc ON vrc.RuleSystemName = prc.RuleSystemName
INNER JOIN [dbo].[vPerformanceRuleInstance] pri ON pri.RuleRowId=vrc.RuleRowId AND ci.InstanceName=pri.InstanceName
LEFT OUTER JOIN #counterInst cidup ON ci.SeriesGroupNo=cidup.SeriesGroupNo AND pri.PerformanceRuleInstanceRowId=cidup.PerformanceRuleInstanceRowId
WHERE cidup.PerformanceRuleInstanceRowId IS NULL

UPDATE ci
SET
PerformanceRuleRowId = vpri.RuleRowId
FROM
#counterInst ci
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.PerformanceRuleInstanceRowId = ci.PerformanceRuleInstanceRowId

UPDATE ic
SET
ParentPerformanceRuleInstanceRowId = ip.PerformanceRuleInstanceRowId,
ParentPerformanceRuleRowId = ip.PerformanceRuleRowId,
MergeCandidateInd = 1
FROM
#counterInst ip
INNER JOIN [dbo].[vRule] vrp ON ip.PerformanceRuleRowId=vrp.RuleRowId
INNER JOIN [dbo].[vPerformanceRule] vprp ON ip.PerformanceRuleRowId=vprp.RuleRowId
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prp ON prp.RuleSystemName = vrp.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prc ON prc.ParentPerformanceRuleId=prp.PerformanceRuleId
INNER JOIN [dbo].[vRule] vrc ON prc.RuleSystemName=vrc.RuleSystemName
INNER JOIN #counterInst ic ON vrc.RuleRowId=ic.PerformanceRuleRowId AND ic.InstanceName=ip.InstanceName
INNER JOIN [dbo].[vPerformanceRule] vprc ON ic.PerformanceRuleRowId=vprc.RuleRowId AND vprp.ObjectName=vprc.ObjectName AND vprp.CounterName=vprp.CounterName

UPDATE ci
SET
ParentPerformanceRuleInstanceRowId = ci.PerformanceRuleInstanceRowId,
ParentPerformanceRuleRowId = ci.PerformanceRuleRowId,
MergeCandidateInd = 1
FROM #counterInst ci
WHERE ci.PerformanceRuleInstanceRowId IN (SELECT DISTINCT ParentPerformanceRuleInstanceRowId FROM #counterInst WHERE ParentPerformanceRuleInstanceRowId IS NOT NULL)
END

-- raw values. will be combined with configuration data (#section, #chart, #seriesGroup, #obj, #counterInst) later.
-- will be used to generate configuration data for "Linked" modes
IF @DataAgg=1
BEGIN
-- daily aggregation
INSERT INTO #rawValues
(
RuleRowId, PerformanceRuleInstanceRowId, InstanceName, ManagedEntityRowId, RawManagedEntityRowId,
[DateTime], SampleCount, AverageValue, MinValue, MaxValue, StandardDeviation,
TopLevelHostManagedEntityRowId, ParentRuleRowId, ParentPerformanceRuleInstanceRowId, MergeCandidateInd
)
SELECT
r.RuleRowId, pri.PerformanceRuleInstanceRowId, pri.InstanceName, me.ManagedEntityRowId, me.ManagedEntityRowId,
p.[DateTime], p.SampleCount, p.AverageValue, p.MinValue, p.MaxValue, p.StandardDeviation,
me.TopLevelHostManagedEntityRowId, i.ParentPerformanceRuleRowId, i.ParentPerformanceRuleInstanceRowId, i.MergeCandidateInd
FROM
perf.vPerfDaily p
INNER JOIN [dbo].[vPerformanceRuleInstance] pri ON pri.PerformanceRuleInstanceRowId = p.PerformanceRuleInstanceRowId
INNER JOIN [dbo].[vPerformanceRule] pr ON pr.RuleRowId = pri.RuleRowId
INNER JOIN [dbo].[vRule] r ON r.RuleRowId = pr.RuleRowId
INNER JOIN [dbo].[vManagedEntity] me ON me.ManagedEntityRowId = p.ManagedEntityRowId
INNER JOIN (SELECT DISTINCT ci.PerformanceRuleInstanceRowId, ci.InstanceName, ci.ParentPerformanceRuleInstanceRowId, ci.ParentPerformanceRuleRowId, ci.MergeCandidateInd
FROM #counterInst ci) AS i ON i.PerformanceRuleInstanceRowId = pri.PerformanceRuleInstanceRowId
INNER JOIN (SELECT DISTINCT obj.ManagedEntityRowId FROM #obj obj) AS o ON o.ManagedEntityRowId=p.ManagedEntityRowId
WHERE
(p.DateTime &gt;= CONVERT(DATETIME,CONVERT(VARCHAR(8), @dtStart, 112)))
AND (p.DateTime &lt; DATEADD(hour,24,CONVERT(DATETIME,CONVERT(VARCHAR(8), @dtEnd, 112))))
END
ELSE
BEGIN
-- hourly aggregation
INSERT INTO #rawValues
(
RuleRowId, PerformanceRuleInstanceRowId, InstanceName, ManagedEntityRowId, RawManagedEntityRowId,
[DateTime], SampleCount, AverageValue, MinValue, MaxValue, StandardDeviation,
TopLevelHostManagedEntityRowId, ParentRuleRowId, ParentPerformanceRuleInstanceRowId, MergeCandidateInd
)
SELECT
r.RuleRowId, pri.PerformanceRuleInstanceRowId, pri.InstanceName, me.ManagedEntityRowId, me.ManagedEntityRowId,
p.[DateTime], p.SampleCount, p.AverageValue, p.MinValue, p.MaxValue, p.StandardDeviation,
me.TopLevelHostManagedEntityRowId, i.ParentPerformanceRuleRowId, i.ParentPerformanceRuleInstanceRowId, i.MergeCandidateInd
FROM
perf.vPerfHourly p
INNER JOIN [dbo].[vPerformanceRuleInstance] pri ON pri.PerformanceRuleInstanceRowId = p.PerformanceRuleInstanceRowId
INNER JOIN [dbo].[vPerformanceRule] pr ON pr.RuleRowId = pri.RuleRowId
INNER JOIN [dbo].[vRule] r ON r.RuleRowId = pr.RuleRowId
INNER JOIN [dbo].[vManagedEntity] me ON me.ManagedEntityRowId = p.ManagedEntityRowId
INNER JOIN (SELECT DISTINCT ci.PerformanceRuleInstanceRowId, ci.InstanceName, ci.ParentPerformanceRuleInstanceRowId, ci.ParentPerformanceRuleRowId, ci.MergeCandidateInd
FROM #counterInst ci) AS i ON i.PerformanceRuleInstanceRowId = pri.PerformanceRuleInstanceRowId
INNER JOIN (SELECT DISTINCT obj.ManagedEntityRowId FROM #obj obj) AS o ON o.ManagedEntityRowId=p.ManagedEntityRowId
WHERE
(p.DateTime &gt;= DATEADD(hour, DATEPART(hour, @dtStart), convert(varchar(8), @dtStart, 112)))
AND
(p.DateTime &lt; DATEADD(hour, DATEPART(hour, @dtEnd), convert(varchar(8), @dtEnd, 112)))

END

IF EXISTS (SELECT TOP 1 1 FROM #rawValues WHERE MergeCandidateInd=1)
BEGIN
INSERT #rawValues
(
RuleRowId, PerformanceRuleInstanceRowId, InstanceName,
ManagedEntityRowId, [DateTime], SampleCount, AverageValue, MinValue,
MaxValue, StandardDeviation, MergeCandidateInd
)
SELECT
RuleRowId = v.ParentRuleRowId,
PerformanceRuleInstanceRowId = v.ParentPerformanceRuleInstanceRowId,
InstanceName = v.InstanceName,
ManagedEntityRowId = v.TopLevelHostManagedEntityRowId,
[DateTime] = v.[DateTime],
SampleCount = SUM(v.SampleCount),
AverageValue = SUM(v.SampleCount*v.AverageValue)/SUM(v.SampleCount),
MinValue = MIN(v.MinValue),
MaxValue = MAX(v.MaxValue),
StandardDeviation = SQRT(SUM(v.SampleCount*POWER(v.StandardDeviation,2))/SUM(v.SampleCount)),
MergeCandidateInd = 0
FROM
#rawValues v
WHERE MergeCandidateInd=1
GROUP BY
v.ParentRuleRowId,
v.ParentPerformanceRuleInstanceRowId,
v.InstanceName,
v.TopLevelHostManagedEntityRowId,
v.[DateTime]

INSERT INTO #obj
(
ManagedEntityRowId,
SeriesGroupNo
)
SELECT DISTINCT vme.TopLevelHostManagedEntityRowId, o.SeriesGroupNo
FROM
#rawValues rv
INNER JOIN #obj o ON o.ManagedEntityRowId = rv.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = rv.ManagedEntityRowId
WHERE rv.MergeCandidateInd=1

DELETE FROM #rawValues WHERE MergeCandidateInd=1
END

-- parse charts and series info
IF @SectionMode='N'
BEGIN
INSERT INTO #seriesGroup
([Group], GroupTitle, SeriesGroupNo, ChartScale, ChartType, ChartColor, OptionXml)
SELECT
[Group],
GroupTitle,
SeriesGroupNo,
ChartScale,
ChartType,
ChartColor,
OptionXml
FROM
OPENXML(@xmldoc_config, '/Data/Values/Value', 2) WITH
(
[Group] INT '@mp:parentid',
GroupTitle NVARCHAR(255) '../@Title',
SeriesGroupNo INT '@mp:id',
ChartScale FLOAT 'Scale',
ChartType NVARCHAR(255) 'Type',
ChartColor NVARCHAR(255) 'Color',
OptionXml XML '@mp:xmltext'
)

UPDATE c
SET c.ChartNo = z.RowNo
FROM
#seriesGroup c
INNER JOIN
(
SELECT
x.[Group],
RowNo = ROW_NUMBER() OVER (ORDER BY x.[Group])
FROM
(SELECT DISTINCT [Group] FROM #seriesGroup) x
) as z ON z.[Group]=c.[Group]

INSERT INTO #chart (SectionNo, ChartNo, ChartName)
SELECT DISTINCT ChartNo,ChartNo, GroupTitle FROM #seriesGroup

INSERT INTO #section (SectionNo, SectionTitle)
SELECT SectionNo, ChartName FROM #chart
END
ELSE
BEGIN
DECLARE @cfg TABLE
(
GroupName NVARCHAR(512),
GroupId INT,
ObjectName NVARCHAR(512),
ObjectId INT,
RuleRowId INT,
RuleName NVARCHAR(512),
InstanceName NVARCHAR(512),
PerformanceRuleInstanceRowId INT,
MeasurementUnitName NVARCHAR(256),
SectionId INT,
SectionTitle NVARCHAR(MAX),
ChartKey NVARCHAR(MAX),
ChartId INT,
ChartTitle NVARCHAR(MAX),
SeriesGroupKey INT,
SeriesGroupId INT,
ChartScale FLOAT
)

DECLARE @SectionObjectTypeId INT

SELECT @SectionObjectTypeId=vmet.ManagedEntityTypeRowId FROM
[dbo].[Veeam_GRL_Report] r
INNER JOIN [dbo].[vManagedEntityType] vmet ON r.ReportTargetManagementEntityTypeSystemName=vmet.ManagedEntityTypeSystemName
WHERE r.ReportSystemName=@ReportId

INSERT @cfg
(GroupName, GroupId, ObjectName, ObjectId, RuleRowId, RuleName,
InstanceName, PerformanceRuleInstanceRowId, MeasurementUnitName,
SectionId, SectionTitle, ChartKey, ChartTitle, SeriesGroupKey,
ChartScale)
SELECT
DISTINCT
GroupName=/*ISNULL(vmeg.Path,'') + CASE WHEN vmeg.[Path] IS NOT NULL THEN '\' ELSE '' END +*/ vmeg.ManagedEntityDefaultName,
GroupId=g.ManagedEntityRowId,
ObjectName=/*ISNULL(vme.Path,'') + CASE WHEN vme.[Path] IS NOT NULL THEN '\' ELSE '' END +*/ vme.ManagedEntityDefaultName,
ObjectId=vme.ManagedEntityRowId,
vr.RuleRowId,
vr.RuleDefaultName,
rv.InstanceName,
rv.PerformanceRuleInstanceRowId,
mu.MeasurementUnitName,
CASE WHEN @SectionMode='G' THEN g.ManagedEntityRowId
WHEN @SectionMode='O' THEN vmeh.ManagedEntityRowId
WHEN @SectionMode='C' THEN vr.RuleRowId END,
CASE WHEN @SectionMode='G' THEN ISNULL(vmeg.Path,'') + CASE WHEN vmeg.[Path] IS NOT NULL THEN '\' ELSE '' END + vmeg.ManagedEntityDefaultName
WHEN @SectionMode='O' AND vmeh.ManagedEntityTypeRowId=@SectionObjectTypeId THEN ISNULL(vmeh.Path,'') + CASE WHEN vmeh.[Path] IS NOT NULL THEN '\' ELSE '' END + vmeh.ManagedEntityDefaultName +' ('+vmet.ManagedEntityTypeDefaultName+')'
WHEN @SectionMode='O' AND vmeh.ManagedEntityTypeRowId&lt;&gt;@SectionObjectTypeId THEN ISNULL(vmeh.Path,'') + CASE WHEN vmeh.[Path] IS NOT NULL THEN '\' ELSE '' END + vmeh.ManagedEntityDefaultName +' ('+vmet.ManagedEntityTypeDefaultName+')'
WHEN @SectionMode='C' THEN vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+')' END,
CASE WHEN @ChartMode=1 THEN CONVERT(NVARCHAR(256),ROW_NUMBER() OVER(ORDER BY rv.PerformanceRuleInstanceRowId, vme.ManagedEntityRowId)) -- 1 chart per counter instance
WHEN @ChartMode=2 THEN vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+') '+CONVERT(NVARCHAR(MAX),vr.RuleRowId) -- 1 chart per counter
WHEN @ChartMode=3 THEN CONVERT(NVARCHAR(256),mu.MeasurementUnitId) -- 1 chart per measurement unit (all counters with the same MU on the same chart)
WHEN @ChartMode=4 THEN CONVERT(NVARCHAR(256),vme.ManagedEntityRowId)+'-'+CONVERT(VARCHAR(256),mu.MeasurementUnitId) -- 1 chart per measurement unit and target
WHEN @ChartMode=5 THEN CONVERT(NVARCHAR(256),vmeh.ManagedEntityRowId) -- 1 chart per top level host
WHEN @ChartMode=6 THEN CONVERT(NVARCHAR(256),vmeg.ManagedEntityRowId) -- 1 chart per group
WHEN @ChartMode=7 THEN CONVERT(NVARCHAR(256),0) -- 1 chart for everything
END,
CASE WHEN @ChartMode=1 THEN vpr.ObjectName+'\'+vpr.CounterName+'\'+rv.InstanceName+' ('+vr.RuleDefaultName+')' -- 1 chart per counter instance
WHEN @ChartMode=2 THEN vpr.ObjectName+'\'+vpr.CounterName+' ('+vr.RuleDefaultName+')' -- 1 chart per counter
WHEN @ChartMode=3 THEN '' --mu.MeasurementUnitName -- 1 chart per measurement unit (all counters with the same MU on the same chart) - we display MU name as an axes label, so we don't need it as a title
WHEN @ChartMode=4 THEN ISNULL(vme.Path,'') + CASE WHEN vme.[Path] IS NOT NULL THEN '\' ELSE '' END + vme.ManagedEntityDefaultName + ' ('+mu.MeasurementUnitName+')' -- 1 chart per measurement unit and target
WHEN @ChartMode=5 AND vmeh.ManagedEntityTypeRowId=@SectionObjectTypeId THEN ISNULL(vmeh.Path,'') + CASE WHEN vmeh.[Path] IS NOT NULL THEN '\' ELSE '' END + vmeh.ManagedEntityDefaultName +' ('+vmet.ManagedEntityTypeDefaultName+')' -- 1 chart per top level host
WHEN @ChartMode=5 AND vmeh.ManagedEntityTypeRowId&lt;&gt;@SectionObjectTypeId THEN ISNULL(vmeh.Path,'') + CASE WHEN vmeh.[Path] IS NOT NULL THEN '\' ELSE '' END + vmeh.ManagedEntityDefaultName +' ('+vmet.ManagedEntityTypeDefaultName+')' -- 1 chart per top level host
WHEN @ChartMode=6 THEN ISNULL(vmeg.Path,'') + CASE WHEN vmeg.[Path] IS NOT NULL THEN '\' ELSE '' END + vmeg.ManagedEntityDefaultName -- 1 chart per group
END,
vr.RuleRowId,
pr.DefaultScale
FROM
#objGr g
INNER JOIN #obj o ON g.SeriesGroupNo=o.SeriesGroupNo
INNER JOIN #rawValues rv ON o.ManagedEntityRowId=rv.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntity] vmeg ON vmeg.ManagedEntityRowId = g.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntity] vmeh ON vme.TopLevelHostManagedEntityRowId=vmeh.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmeh.ManagedEntityTypeRowId=vmet.ManagedEntityTypeRowId
INNER JOIN [dbo].[vRule] vr ON vr.RuleRowId = rv.RuleRowId
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_MeasurementUnit] mu ON mu.MeasurementUnitId = pr.MeasurementUnitId
WHERE g.[Level]=0

UPDATE @cfg
SET ChartId=x.ChartId
FROM
@cfg c
INNER JOIN
(
SELECT
ChartId=ROW_NUMBER() OVER (ORDER BY SectionId, ChartKey), SectionId, ChartKey
FROM @cfg
GROUP BY SectionId, ChartKey
) AS x ON c.SectionId=x.SectionId AND c.ChartKey=x.ChartKey

UPDATE @cfg
SET SeriesGroupId=x.SeriesGroupId
FROM
@cfg c
INNER JOIN
(
SELECT
SeriesGroupId=ROW_NUMBER() OVER (ORDER BY SectionId, ChartId, SeriesGroupKey), SectionId, ChartId, SeriesGroupKey
FROM @cfg
GROUP BY SectionId, ChartId, SeriesGroupKey
) AS x ON c.SectionId=x.SectionId AND c.ChartId=x.ChartId AND c.SeriesGroupKey=x.SeriesGroupKey

INSERT INTO #section
(
SectionNo,
SectionTitle
)
SELECT DISTINCT
c.SectionId, c.SectionTitle
FROM @cfg c

INSERT INTO #chart
(
SectionNo,
ChartNo,
ChartName
)
SELECT DISTINCT
c.SectionId, c.ChartId, c.ChartTitle
FROM @cfg c

TRUNCATE TABLE #seriesGroup

INSERT INTO #seriesGroup
(
ChartNo,
[Group],
GroupTitle,
SeriesGroupNo,
ChartScale,
ChartType,
ChartColor,
OptionXml
)
SELECT DISTINCT
c.ChartId, c.ChartId, NULL, c.SeriesGroupId, c.ChartScale, CASE WHEN @Histogram&gt;0 THEN 'Column' ELSE 'Line' END, cc.ColorCode, NULL
FROM
@cfg c
LEFT OUTER JOIN [dbo].[Veeam_GRL_ColorCode] cc ON cc.ColorCodeRowId=c.SeriesGroupId%32

TRUNCATE TABLE #obj

INSERT INTO #obj
(
ManagedEntityRowId,
SeriesGroupNo
)
SELECT DISTINCT
c.ObjectId, c.SeriesGroupId
FROM @cfg c

TRUNCATE TABLE #counterInst

INSERT INTO #counterInst
(PerformanceRuleInstanceRowId, InstanceName, SeriesGroupNo)
SELECT DISTINCT
c.PerformanceRuleInstanceRowId, c.InstanceName, c.SeriesGroupId
FROM @cfg c
END

-- remove counter instances that have no data
DELETE FROM #counterInst
WHERE PerformanceRuleInstanceRowId NOT IN (SELECT DISTINCT rv.PerformanceRuleInstanceRowId
FROM #rawValues rv)

-- remove objects that have no data
DELETE FROM #obj
WHERE ManagedEntityRowId NOT IN (SELECT DISTINCT rv.ManagedEntityRowId
FROM #rawValues rv)

-- per-instance, per-object perf data
INSERT INTO #values
(
SectionNo,
SectionTitle,
ChartNo,
ChartTitle,
SeriesGroupNo,
ChartScale,
ChartType,
ChartColor,
ManagementGroupGuid,
ManagementGroupDefaultName,
ManagedEntityTypeDefaultName,
ManagedEntityRowId,
RawManagedEntityRowId,
ManagedEntityGuid,
[Path],
ManagedEntityFullName,
ManagedEntityDefaultName,
RuleRowId,
RuleGuid,
RuleDefaultName,
MultiInstanceInd,
ObjectName,
CounterName,
InstanceName,
ValueNo,
[DateTime],
SampleCount,
AverageValue,
SumAvgValue,
MinValue,
MaxMinValue,
SumMinValue,
MaxValue,
MinMaxValue,
SumMaxValue,
SumValue,
StandardDeviation,
RowType,
OptionXml
)
SELECT
s.SectionNo,
s.SectionTitle,
c.ChartNo,
c.ChartName,
sg.SeriesGroupNo,
sg.ChartScale,
sg.ChartType,
sg.ChartColor,
vmg.ManagementGroupGuid,
vmg.ManagementGroupDefaultName,
vmet.ManagedEntityTypeDefaultName,
vme.ManagedEntityRowId,
v.RawManagedEntityRowId,
vme.ManagedEntityGuid,
vme.[Path],
vme.FullName,
vme.DisplayName,
vr.RuleRowId,
vr.RuleGuid,
vr.RuleDefaultName,
vpr.MultiInstanceInd,
vpr.ObjectName,
vpr.CounterName,
i.InstanceName,
ValueNo = ROW_NUMBER() OVER (PARTITION BY s.SectionNo, c.ChartNo, i.SeriesGroupNo, vme.ManagedEntityRowId, v.PerformanceRuleInstanceRowId ORDER BY v.[DateTime]),
v.[DateTime],
v.SampleCount,
v.AverageValue,
v.AverageValue,
v.MinValue,
v.MinValue,
v.MinValue,
v.MaxValue,
v.MaxValue,
v.MaxValue,
v.AverageValue*v.SampleCount,
v.StandardDeviation,
'I',
'&lt;Value&gt;&lt;Object Use="Self"&gt;'+CONVERT(NVARCHAR(MAX),vme.ManagedEntityRowId)+'&lt;/Object&gt;&lt;Rule&gt;'+CONVERT(NVARCHAR(MAX),vr.RuleGuid)+'&lt;/Rule&gt;&lt;Instance/&gt;&lt;/Value&gt;'
FROM
#section s
INNER JOIN #chart c ON c.SectionNo = s.SectionNo
INNER JOIN #seriesGroup sg ON sg.ChartNo = c.ChartNo
INNER JOIN #counterInst i ON i.SeriesGroupNo = sg.SeriesGroupNo
INNER JOIN #obj o ON o.SeriesGroupNo = sg.SeriesGroupNo
INNER JOIN #rawValues v ON v.PerformanceRuleInstanceRowId = i.PerformanceRuleInstanceRowId AND v.ManagedEntityRowId = o.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = v.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagementGroup] vmg ON vmg.ManagementGroupRowId = vme.ManagementGroupRowId
INNER JOIN [dbo].[vRule] vr ON vr.RuleRowId = v.RuleRowId
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
UNION ALL
-- sections/charts that do not have either a) data or b) objects
SELECT DISTINCT
s.SectionNo,
s.SectionTitle,
c.ChartNo,
c.ChartName,
sg.SeriesGroupNo,
sg.ChartScale,
sg.ChartType,
sg.ChartColor,
vmg.ManagementGroupGuid,
vmg.ManagementGroupDefaultName,
vmet.ManagedEntityTypeDefaultName,
vme.ManagedEntityRowId,
v.RawManagedEntityRowId,
vme.ManagedEntityGuid,
vme.[Path],
vme.FullName,
vme.DisplayName,
vr.RuleRowId,
vr.RuleGuid,
vr.RuleDefaultName,
vpr.MultiInstanceInd,
vpr.ObjectName,
vpr.CounterName,
i.InstanceName,
ValueNo = 1,
v.[DateTime],
v.SampleCount,
v.AverageValue,
v.AverageValue,
v.MinValue,
v.MinValue,
v.MinValue,
v.MaxValue,
v.MaxValue,
v.MaxValue,
v.AverageValue*v.SampleCount,
v.StandardDeviation,
'I',
NULL
FROM
#section s
INNER JOIN #chart c ON c.SectionNo = s.SectionNo
INNER JOIN #seriesGroup sg ON sg.ChartNo = c.ChartNo
LEFT OUTER JOIN #counterInst i ON i.SeriesGroupNo = sg.SeriesGroupNo
LEFT OUTER JOIN #obj o ON o.SeriesGroupNo = sg.SeriesGroupNo
LEFT OUTER JOIN #rawValues v ON v.PerformanceRuleInstanceRowId = i.PerformanceRuleInstanceRowId AND v.ManagedEntityRowId = o.ManagedEntityRowId
LEFT OUTER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = v.ManagedEntityRowId
LEFT OUTER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
LEFT OUTER JOIN [dbo].[vManagementGroup] vmg ON vmg.ManagementGroupRowId = vme.ManagementGroupRowId
LEFT OUTER JOIN [dbo].[vRule] vr ON vr.RuleRowId = v.RuleRowId
LEFT OUTER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
--WHERE c.ChartNo=2
WHERE o.ManagedEntityRowId IS NULL OR i.PerformanceRuleInstanceRowId IS NULL

-- instance name may contain some characters which require conversion
UPDATE #values
SET OptionXml.modify('insert text{sql:column("InstanceName")} as first into (/Value/Instance)[1]')
WHERE OptionXml IS NOT NULL

-- Managed Entity (object) average values
IF @DataMode LIKE '%O%'
BEGIN
INSERT INTO #values
(
SectionNo,
SectionTitle,
ChartNo,
ChartTitle,
SeriesGroupNo,
ChartScale,
ChartType,
ChartColor,
RandomColor,
ManagementGroupGuid,
ManagementGroupDefaultName,
ManagedEntityTypeDefaultName,
[Image],
ManagedEntityRowId,
ManagedEntityGuid,
[Path],
ManagedEntityFullName,
ManagedEntityDefaultName,
RuleRowId,
RuleGuid,
RuleDefaultName,
MultiInstanceInd,
ObjectName,
CounterName,
InstanceName,
ValueNo,
[DateTime],
SampleCount,
AverageValue,
SumAvgValue,
MinValue,
MaxMinValue,
SumMinValue,
MaxValue,
MinMaxValue,
SumMaxValue,
SumValue,
StandardDeviation,
RowType,
OptionXml
)
SELECT
v.SectionNo,
v.SectionTitle,
v.ChartNo,
v.ChartTitle,
v.SeriesGroupNo,
v.ChartScale,
v.ChartType,
v.ChartColor,
v.RandomColor,
v.ManagementGroupGuid,
v.ManagementGroupDefaultName,
v.ManagedEntityTypeDefaultName,
v.[Image],
v.ManagedEntityRowId,
v.ManagedEntityGuid,
v.[Path],
v.ManagedEntityFullName,
v.ManagedEntityDefaultName,
v.RuleRowId,
v.RuleGuid,
v.RuleDefaultName,
v.MultiInstanceInd,
v.ObjectName,
v.CounterName,
NULL,
ROW_NUMBER() OVER (PARTITION BY SectionNo, ChartNo, SeriesGroupNo, ManagedEntityRowId ORDER BY [DateTime]),
[DateTime],
SUM(v.SampleCount),
SUM(v.SampleCount*v.AverageValue)/SUM(v.SampleCount),
SUM(v.AverageValue),
MIN(v.MinValue),
MAX(v.MinValue),
SUM(v.MinValue),
MAX(v.MaxValue),
MIN(v.MaxValue),
SUM(v.MaxValue),
SUM(v.SumValue),
SQRT(SUM(v.SampleCount*POWER(v.StandardDeviation,2))/SUM(v.SampleCount)),
'O',
'&lt;Value&gt;&lt;Object Use="Containment"&gt;'+CONVERT(NVARCHAR(MAX),v.ManagedEntityRowId)+'&lt;/Object&gt;&lt;Rule&gt;'+CONVERT(NVARCHAR(MAX),v.RuleGuid)+'&lt;/Rule&gt;&lt;/Value&gt;'
FROM
#values v
WHERE v.RowType='I' AND v.[DateTime] IS NOT NULL
GROUP BY
v.SectionNo, v.SectionTitle, v.ChartNo, v.ChartTitle,
v.SeriesGroupNo, v.ChartScale, v.ChartType, v.ChartColor,
v.RandomColor, v.ManagementGroupGuid, v.ManagementGroupDefaultName,
v.ManagedEntityTypeDefaultName, v.[Image], v.ManagedEntityRowId,
v.ManagedEntityGuid, v.[Path], v.ManagedEntityFullName,
v.ManagedEntityDefaultName, v.RuleRowId, v.RuleGuid,
v.RuleDefaultName, v.MultiInstanceInd, v.ObjectName, v.CounterName, v.[DateTime]
END

-- Group (chart) average values
IF @DataMode LIKE '%G%'
BEGIN
INSERT INTO #values
(
SectionNo,
SectionTitle,
ChartNo,
ChartTitle,
SeriesGroupNo,
ChartScale,
ChartType,
ChartColor,
RandomColor,
ManagementGroupGuid,
ManagementGroupDefaultName,
RuleRowId,
RuleGuid,
RuleDefaultName,
MultiInstanceInd,
ObjectName,
CounterName,
InstanceName,
ValueNo,
[DateTime],
SampleCount,
AverageValue,
SumAvgValue,
MinValue,
MaxMinValue,
SumMinValue,
MaxValue,
MinMaxValue,
SumMaxValue,
SumValue,
StandardDeviation,
RowType
)
SELECT
v.SectionNo,
v.SectionTitle,
v.ChartNo,
v.ChartTitle,
v.SeriesGroupNo,
v.ChartScale,
v.ChartType,
v.ChartColor,
v.RandomColor,
v.ManagementGroupGuid,
v.ManagementGroupDefaultName,
v.RuleRowId,
v.RuleGuid,
v.RuleDefaultName,
v.MultiInstanceInd,
v.ObjectName,
v.CounterName,
NULL,
ROW_NUMBER() OVER (PARTITION BY v.SectionNo, v.ChartNo, v.SeriesGroupNo ORDER BY [DateTime]),
[DateTime],
SUM(v.SampleCount),
SUM(v.SampleCount*v.AverageValue)/SUM(v.SampleCount),
SUM(v.AverageValue),
MIN(v.MinValue),
MAX(v.MinValue),
SUM(v.MinValue),
MAX(v.MaxValue),
MIN(v.MaxValue),
SUM(v.MaxValue),
SUM(v.SumValue),
SQRT(SUM(v.SampleCount*POWER(v.StandardDeviation,2))/SUM(v.SampleCount)),
'G'
FROM
#values v
WHERE v.RowType='I' AND v.[DateTime] IS NOT NULL
GROUP BY
v.SectionNo, v.SectionTitle, v.ChartNo, v.ChartTitle,
v.SeriesGroupNo, v.ChartScale, v.ChartType, v.ChartColor,
v.RandomColor, v.ManagementGroupGuid, v.ManagementGroupDefaultName,
v.RuleRowId, v.RuleGuid,
v.RuleDefaultName, v.MultiInstanceInd, v.ObjectName, v.CounterName, v.[DateTime]

UPDATE v
SET OptionXml = sg.OptionXml
FROM
#values v
INNER JOIN #seriesGroup sg ON sg.SeriesGroupNo = v.SeriesGroupNo
WHERE v.RowType='G'
END

-- Numerate object-instance pairs within group (chart) scope. Numbering will be used for labeling purposes
-- Set random color
UPDATE #values
SET ObjInstNo = oir.ObjInstNo,
RandomColor = cc.ColorCode
FROM
#values v
INNER JOIN
(
SELECT
oi.*,
ObjInstNo=ROW_NUMBER() OVER (PARTITION BY SectionNo, ChartNo ORDER BY SeriesGroupNo, ManagedEntityDefaultName, RuleRowId, RuleDefaultName, InstanceName)
FROM
(
SELECT DISTINCT SectionNo, ChartNo, SeriesGroupNo, ManagedEntityRowId, ManagedEntityDefaultName, RuleRowId, RuleDefaultName, InstanceName
FROM #values
) oi
) oir ON
v.SectionNo=oir.SectionNo
AND v.ChartNo=oir.ChartNo
AND v.SeriesGroupNo=oir.SeriesGroupNo
AND isnull(v.ManagedEntityRowId,0)=isnull(oir.ManagedEntityRowId,0)
AND isnull(v.InstanceName,'---NULL---')=isnull(oir.InstanceName,'---NULL---')
LEFT OUTER JOIN [dbo].[Veeam_GRL_ColorCode] cc ON cc.ColorCodeRowId=oir.ObjInstNo % 32

CREATE INDEX #ix2 ON #values (ObjInstNo)

-- set labels for first, middle and last values for each series instance
UPDATE #values
SET ValueLabel = CONVERT(NVARCHAR(512),v.ObjInstNo)+' ('+v.RowType+')'
FROM
#values v
INNER JOIN
(
SELECT ObjInstNo, ValueNo=MIN(ValueNo)
FROM #values WHERE #values.[DateTime] IS NOT NULL
GROUP BY ObjInstNo

UNION

SELECT ObjInstNo, ValueNo=MAX(ValueNo)/2
FROM #values WHERE #values.[DateTime] IS NOT NULL
GROUP BY ObjInstNo

UNION

SELECT ObjInstNo, ValueNo=MAX(ValueNo)
FROM #values WHERE #values.[DateTime] IS NOT NULL
GROUP BY ObjInstNo
) x ON v.ObjInstNo=x.ObjInstNo AND v.ValueNo=x.ValueNo

-- gap detection
UPDATE v1
SET TimeToNextValue = CASE WHEN @DataAgg=1 THEN DATEDIFF(day,v1.[DateTime],v2.[DateTime]) ELSE DATEDIFF(hour,v1.[DateTime],v2.[DateTime]) END
FROM
#values v1 INNER JOIN
#values v2 ON v1.ObjInstNo=v2.ObjInstNo AND v1.ChartNo=v2.ChartNo AND v1.ValueNo=v2.ValueNo-1

DECLARE @maxGapCount INT

SELECT @maxGapCount = MAX(TimeToNextValue) FROM #values WHERE TimeToNextValue IS NOT NULL

IF @maxGapCount&gt;1
BEGIN
DECLARE @GapOffsets TABLE (i INT IDENTITY, dummy BIT)

INSERT @GapOffsets (dummy)
SELECT TOP(@maxGapCount) 0 FROM [dbo].[Date] d

-- insert empty points
INSERT #values
(SectionNo, SectionTitle, ChartNo, ChartTitle, SeriesGroupNo,
ChartScale, ChartType, ChartColor, RandomColor, ManagementGroupGuid,
ManagementGroupDefaultName, ManagedEntityTypeDefaultName, [Image],
ManagedEntityRowId, ManagedEntityGuid, [Path], ManagedEntityFullName,
ManagedEntityDefaultName, RuleRowId, RuleGuid, RuleDefaultName,
MeasurementUnitName, AggFunction, MultiInstanceInd, ObjectName,
CounterName, InstanceName, ObjInstNo, ValueNo, ValueLabel, [DateTime],
TimeToNextValue, SampleCount, AverageValue, SumAvgValue, MinValue, MaxMinValue, SumMinValue, MaxValue, MinMaxValue, SumMaxValue,
SumValue, StandardDeviation, RowType)
SELECT
v.SectionNo, v.SectionTitle, v.ChartNo, v.ChartTitle,
v.SeriesGroupNo, v.ChartScale, v.ChartType, v.ChartColor,
v.RandomColor, v.ManagementGroupGuid, v.ManagementGroupDefaultName,
v.ManagedEntityTypeDefaultName, v.[Image], v.ManagedEntityRowId,
v.ManagedEntityGuid, v.[Path], v.ManagedEntityFullName,
v.ManagedEntityDefaultName, v.RuleRowId, v.RuleGuid,
v.RuleDefaultName, v.MeasurementUnitName, v.AggFunction,
v.MultiInstanceInd, v.ObjectName, v.CounterName, v.InstanceName,
v.ObjInstNo, v.ValueNo,
ValueLabel = NULL,
[DateTime] = CASE WHEN @DataAgg=1 THEN DATEADD(DAY,g.i,v.[DateTime]) ELSE DATEADD(hour,g.i,v.[DateTime]) END,
TimeToNextValue = 0,
SampleCount = 0,
AverageValue = 0,
SumAvgValue = 0,
MinValue = 0,
MaxMinValue = 0,
SumMinValue = 0,
MaxValue = 0,
MinMaxValue = 0,
SumMaxValue = 0,
SumValue = 0,
StandardDeviation = 0,
v.RowType
FROM
#values v
INNER JOIN @GapOffsets g ON v.TimeToNextValue&gt;g.i
WHERE v.TimeToNextValue&gt;1

-- renumber
UPDATE v
SET v.ValueNo = X.ValueNo
FROM
#values v
INNER JOIN
(
SELECT
a.RowId,
ValueNo = ROW_NUMBER() OVER ( PARTITION BY a.SectionNo, a.ChartNo, a.SeriesGroupNo, a.ObjInstNo ORDER BY a.[DateTime] )
FROM #values a
) AS X ON v.RowId=X.RowId

END

-- set measurement units and aggregation function
UPDATE v
SET
MeasurementUnitName = mu.MeasurementUnitName,
AggFunction = isnull(pr.DefaultAggregationFunction,'Avg')
FROM
#values v
INNER JOIN [dbo].[vRule] vr ON vr.RuleRowId = v.RuleRowId
LEFT OUTER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
LEFT OUTER JOIN [dbo].[Veeam_GRL_MeasurementUnit] mu ON mu.MeasurementUnitId = pr.MeasurementUnitId

-- set URLs
UPDATE v
SET RuleUrl = vgpr.[URL]
FROM
#values v
INNER JOIN [dbo].[vRule] vr ON vr.RuleRowId = v.RuleRowId
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] vgpr ON vgpr.RuleSystemName = vr.RuleSystemName

-- calculate trends
IF @enableTrendCalc=1
BEGIN
DECLARE @trendCoef TABLE
(
ChartNo INT,
SeriesGroupNo INT,
ObjInstNo INT,
ManagedEntityRowId INT,
RuleRowId INT,
InstanceName NVARCHAR(512),
RowType CHAR(1),
LastValueNo INT,
LastDateTime DATETIME,
Cnt BIGINT,
a_avg FLOAT,
b_avg FLOAT,
stdev_avg FLOAT,
a_sumavg FLOAT,
b_sumavg FLOAT,
stdev_sumavg FLOAT,
a_min FLOAT,
b_min FLOAT,
stdev_min FLOAT,
a_maxmin FLOAT,
b_maxmin FLOAT,
stdev_maxmin FLOAT,
a_summin FLOAT,
b_summin FLOAT,
stdev_summin FLOAT,
a_max FLOAT,
b_max FLOAT,
stdev_max FLOAT,
a_minmax FLOAT,
b_minmax FLOAT,
stdev_minmax FLOAT,
a_summax FLOAT,
b_summax FLOAT,
stdev_summax FLOAT,
a_sum FLOAT,
b_sum FLOAT,
stdev_sum FLOAT
)

;WITH sums
(
ChartNo, SeriesGroupNo, ObjInstNo,
ManagedEntityRowId, RuleRowId, InstanceName,
RowType,
x, x2, x_p2,
y_avg, yx_avg,
y_sumavg, yx_sumavg,
y_min, yx_min,
y_maxmin, yx_maxmin,
y_summin, yx_summin,
y_max, yx_max,
y_minmax, yx_minmax,
y_summax, yx_summax,
y_sum, yx_sum,
lastX, lastDT,
Cnt
)
AS
(
SELECT
v.ChartNo,
v.SeriesGroupNo,
v.ObjInstNo,
v.ManagedEntityRowId, v.RuleRowId, v.InstanceName,
RowType = MIN(v.RowType),
x = SUM(v.ValueNo),
x2 = SUM(POWER(v.ValueNo,2)),
x_p2 = POWER(SUM(v.ValueNo),2),
y_avg = SUM(v.AverageValue),
yx_avg = SUM(v.AverageValue*v.ValueNo),
y_sumavg = SUM(v.SumAvgValue),
yx_sumavg = SUM(v.SumAvgValue*v.ValueNo),
y_min = SUM(v.MinValue),
yx_min = SUM(v.MinValue*v.ValueNo),
y_maxmin = SUM(v.MaxMinValue),
yx_maxmin = SUM(v.MaxMinValue*v.ValueNo),
y_summin = SUM(v.SumMinValue),
yx_summin = SUM(v.SumMinValue*v.ValueNo),
y_max = SUM(v.MaxValue),
yx_max = SUM(v.MaxValue*v.ValueNo),
y_minmax = SUM(v.MinMaxValue),
yx_minmax = SUM(v.MinMaxValue*v.ValueNo),
y_summax = SUM(v.SumMaxValue),
yx_summax = SUM(v.SumMaxValue*v.ValueNo),
y_sum = SUM(v.SumValue),
yx_sum = SUM(v.SumValue*v.ValueNo),
lastX = MAX(v.ValueNo),
lastDT = MAX(v.[DateTime]),
Cnt = COUNT(1)
FROM
#values v
WHERE v.SampleCount&gt;0
GROUP BY
v.ChartNo,
v.SeriesGroupNo,
v.ObjInstNo,
v.ManagedEntityRowId, v.RuleRowId, v.InstanceName
),
slope
(
ChartNo,
SeriesGroupNo,
ObjInstNo,
b_avg,
b_sumavg,
b_min,
b_maxmin,
b_summin,
b_max,
b_minmax,
b_summax,
b_sum
)
AS
(
SELECT
s.ChartNo,
s.SeriesGroupNo,
s.ObjInstNo,
b_avg = (s.Cnt*s.yx_avg-s.x*s.y_avg)/(s.Cnt*s.x2-s.x_p2),
b_sumavg = (s.Cnt*s.yx_sumavg-s.x*s.y_sumavg)/(s.Cnt*s.x2-s.x_p2),
b_min = (s.Cnt*s.yx_min-s.x*s.y_min)/(s.Cnt*s.x2-s.x_p2),
b_maxmin = (s.Cnt*s.yx_maxmin-s.x*s.y_maxmin)/(s.Cnt*s.x2-s.x_p2),
b_summin = (s.Cnt*s.yx_summin-s.x*s.y_summin)/(s.Cnt*s.x2-s.x_p2),
b_max = (s.Cnt*s.yx_max-s.x*s.y_max)/(s.Cnt*s.x2-s.x_p2),
b_minmax = (s.Cnt*s.yx_minmax-s.x*s.y_minmax)/(s.Cnt*s.x2-s.x_p2),
b_summax = (s.Cnt*s.yx_summax-s.x*s.y_summax)/(s.Cnt*s.x2-s.x_p2),
b_sum = (s.Cnt*s.yx_sum-s.x*s.y_sum)/(s.Cnt*s.x2-s.x_p2)
FROM
sums s
WHERE s.Cnt&gt;1
),
intersept
(
ChartNo,
SeriesGroupNo,
ObjInstNo,
a_avg,
a_sumavg,
a_min,
a_maxmin,
a_summin,
a_max,
a_minmax,
a_summax,
a_sum
)
AS
(
SELECT
s.ChartNo,
s.SeriesGroupNo,
s.ObjInstNo,
a_avg = (s.y_avg-p.b_avg*s.x)/s.Cnt,
a_sumavg = (s.y_sumavg-p.b_sumavg*s.x)/s.Cnt,
a_min = (s.y_min-p.b_min*s.x)/s.Cnt,
a_maxmin = (s.y_maxmin-p.b_maxmin*s.x)/s.Cnt,
a_summin = (s.y_summin-p.b_summin*s.x)/s.Cnt,
a_max = (s.y_max-p.b_max*s.x)/s.Cnt,
a_minmax = (s.y_minmax-p.b_minmax*s.x)/s.Cnt,
a_summax = (s.y_summax-p.b_summax*s.x)/s.Cnt,
a_sum = (s.y_sum-p.b_sum*s.x)/s.Cnt
FROM
sums s
INNER JOIN slope p ON s.ChartNo=p.ChartNo AND s.SeriesGroupNo=p.SeriesGroupNo AND s.ObjInstNo=p.ObjInstNo
)
INSERT INTO @trendCoef
(
ChartNo,
SeriesGroupNo,
ObjInstNo,
ManagedEntityRowId,
RuleRowId,
InstanceName,
RowType,
LastValueNo,
LastDateTime,
a_avg,
b_avg,
a_sumavg,
b_sumavg,
a_min,
b_min,
a_maxmin,
b_maxmin,
a_summin,
b_summin,
a_max,
b_max,
a_minmax,
b_minmax,
a_summax,
b_summax,
a_sum,
b_sum
)
SELECT
s.ChartNo,
s.SeriesGroupNo,
s.ObjInstNo,
s.ManagedEntityRowId,
s.RuleRowId,
s.InstanceName,
s.RowType,
s.LastX,
s.LastDT,
i.a_avg,
p.b_avg,
i.a_sumavg,
p.b_sumavg,
i.a_min,
p.b_min,
i.a_maxmin,
p.b_maxmin,
i.a_summin,
p.b_summin,
i.a_max,
p.b_max,
i.a_minmax,
p.b_minmax,
i.a_summax,
p.b_summax,
i.a_sum,
p.b_sum
FROM
intersept i
INNER JOIN slope p ON i.ChartNo=p.ChartNo AND i.SeriesGroupNo=p.SeriesGroupNo AND i.ObjInstNo=p.ObjInstNo
RIGHT OUTER JOIN sums s ON s.ChartNo=p.ChartNo AND s.SeriesGroupNo=p.SeriesGroupNo AND s.ObjInstNo=p.ObjInstNo

UPDATE v
SET
TrendValue_Avg = tc.a_avg+v.ValueNo*tc.b_avg,
TrendValue_SumAvg = tc.a_sumavg+v.ValueNo*tc.b_sumavg,
TrendValue_Min = tc.a_min+v.ValueNo*tc.b_min,
TrendValue_MaxMin = tc.a_maxmin+v.ValueNo*tc.b_maxmin,
TrendValue_SumMin = tc.a_summin+v.ValueNo*tc.b_summin,
TrendValue_Max = tc.a_max+v.ValueNo*tc.b_max,
TrendValue_MinMax = tc.a_minmax+v.ValueNo*tc.b_minmax,
TrendValue_SumMax = tc.a_summax+v.ValueNo*tc.b_summax,
TrendValue_Sum = tc.a_sum+v.ValueNo*tc.b_sum
FROM
#values v
INNER JOIN @trendCoef tc ON tc.ChartNo = v.ChartNo AND tc.SeriesGroupNo = v.SeriesGroupNo AND tc.ObjInstNo = v.ObjInstNo

-- calculate trend deviation estimate (this is NOT a confidence interval yet! t-coef should be applied!)
UPDATE tc
SET
tc.stdev_avg = ISNULL(r2.stdev_avg,0),
tc.stdev_sumavg = ISNULL(r2.stdev_sumavg,0),
tc.stdev_min = ISNULL(r2.stdev_min,0),
tc.stdev_maxmin = ISNULL(r2.stdev_maxmin,0),
tc.stdev_summin = ISNULL(r2.stdev_summin,0),
tc.stdev_max = ISNULL(r2.stdev_max,0),
tc.stdev_minmax = ISNULL(r2.stdev_minmax,0),
tc.stdev_summax = ISNULL(r2.stdev_summax,0),
tc.stdev_sum = ISNULL(r2.stdev_sum,0)
FROM
@trendCoef tc
LEFT OUTER JOIN
(
SELECT
v.ChartNo,
v.SeriesGroupNo,
v.ObjInstNo,

stdev_avg=STDEV(v.AverageValue-v.TrendValue_Avg),
stdev_sumavg=STDEV(v.SumAvgValue-v.TrendValue_SumAvg),
stdev_min=STDEV(v.MinValue-v.TrendValue_Min),
stdev_maxmin=STDEV(v.MaxMinValue-v.TrendValue_MaxMin),
stdev_summin=STDEV(v.SumMinValue-v.TrendValue_SumMin),
stdev_max=STDEV(v.MaxValue-v.TrendValue_Max),
stdev_minmax=STDEV(v.MinMaxValue-v.TrendValue_MinMax),
stdev_summax=STDEV(v.SumMaxValue-v.TrendValue_SumMax),
stdev_sum=STDEV(v.SumValue-v.TrendValue_Sum)
FROM
#values v
WHERE v.SampleCount&gt;0
GROUP BY
v.ChartNo,
v.SeriesGroupNo,
v.ObjInstNo
HAVING COUNT(1)&gt;2
) AS r2 ON tc.ChartNo=r2.ChartNo AND tc.SeriesGroupNo=r2.SeriesGroupNo AND tc.ObjInstNo=r2.ObjInstNo

IF @XmlOutputOnly=1
BEGIN
SET @XmlTrend =
(
SELECT t.*
FROM @trendCoef t
FOR XML RAW('TrendCoef'), ROOT('Trend')
)
END

END

UPDATE vm
SET StandalonePointInd = 1
FROM
#values vl
FULL OUTER JOIN #values vm ON vm.SectionNo = vl.SectionNo
AND vm.ChartNo = vl.ChartNo
AND vm.SeriesGroupNo = vl.SeriesGroupNo
AND vm.ObjInstNo = vl.ObjInstNo
AND vm.ValueNo-1 = vl.ValueNo
AND isnull(vl.TimeToNextValue,5)&gt;0
AND isnull(vm.TimeToNextValue,5)&gt;0
WHERE
ISNULL(vl.TimeToNextValue,5)&gt;1 AND ISNULL(vm.TimeToNextValue,5)&gt;1
AND vm.[DateTime] IS NOT NULL

IF @XmlOutputOnly=1
BEGIN
DECLARE @XmlVal XML

SET @XmlVal =
(
SELECT SectionNo, ChartNo, SeriesGroupNo, ManagementGroupGuid,
ManagementGroupDefaultName, ManagedEntityTypeDefaultName,
ManagedEntityRowId, ManagedEntityGuid, [Path],
ManagedEntityDefaultName, RuleRowId, RuleGuid,
RuleDefaultName, MeasurementUnitName, AggFunction,
ObjectName, CounterName, InstanceName, ObjInstNo, ValueNo,
[DateTime], SampleCount, AverageValue, SumAvgValue, MinValue, MaxMinValue, SumMinValue, MaxValue, MinMaxValue, SumMaxValue,
SumValue, StandardDeviation, RowType, OptionXml=CAST(OptionXml AS NVARCHAR(MAX)),
TrendValue_Avg, TrendValue_SumAvg, TrendValue_Min, TrendValue_MaxMin, TrendValue_SumMin, TrendValue_Max, TrendValue_MinMax, TrendValue_SumMax,
TrendValue_Sum, StandalonePointInd
FROM #values
ORDER BY ChartNo, SeriesGroupNo, ObjInstNo, [DateTime]
FOR XML RAW('PerfPoint'), ROOT('PerfPoints')
)

IF @XmlTrend IS NULL SET @OutputXml=@XmlVal
ELSE SET @OutputXml = (SELECT @XmlVal, @XmlTrend FOR XML PATH(''), ROOT('Performance') )

END
ELSE
BEGIN
SELECT * FROM #values ORDER BY [DateTime]
END


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

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

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

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

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

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

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

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

IF @xmldoc_config IS NOT NULL
EXEC sp_xml_removedocument @xmldoc_config

IF @xmldoc_counters IS NOT NULL
EXEC sp_xml_removedocument @xmldoc_counters

END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#section') IS NOT NULL
DROP TABLE #section

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

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

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

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

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

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

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

IF @xmldoc_config IS NOT NULL
EXEC sp_xml_removedocument @xmldoc_config

IF @xmldoc_counters IS NOT NULL
EXEC sp_xml_removedocument @xmldoc_counters

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_PerformanceGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_PerformanceTopGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PerformanceTopGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_PerformanceTopGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_PerformanceTopGet]
@StartDate datetime,
@EndDate datetime,
@ObjectList XML = NULL,
@InstanceList XML = NULL,
@RuleId VARCHAR(128),
@IsLinkedReport BIT = 0,
@SortOrder INT=1, -- &gt;= 0 - top, &lt; 0 - bottom
@TopCount INT,
@SortFunction CHAR(3) = 'AVG', -- avg, sum, min, max
@GroupBy CHAR(2) = 'OI' -- OI - object (entity) and counter instance, O - object (entity), I - counter instance
AS
BEGIN
BEGIN TRY

DECLARE @DataAgg TINYINT
SET @DataAgg = CASE WHEN ABS(DATEDIFF(hour,@StartDate,@EndDate))&lt;25 THEN 0 ELSE 1 END

IF @IsLinkedReport=1
BEGIN
IF EXISTS (SELECT TOP 1 1 FROM [dbo].[vRule] vr INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
WHERE vr.RuleGuid=@RuleId )
BEGIN
SELECT @SortFunction=pr.DefaultAggregationFunction
FROM [dbo].[vRule] vr INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
WHERE vr.RuleGuid=@RuleId
END
END

DECLARE @MeasurementUnit VARCHAR(256)

SELECT
@MeasurementUnit=mu.MeasurementUnitName
FROM
[dbo].[vRule] vr
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] pr ON pr.RuleSystemName = vr.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_MeasurementUnit] mu ON pr.MeasurementUnitId = mu.MeasurementUnitId
WHERE
vr.RuleGuid=@RuleId

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#rule') IS NOT NULL DROP TABLE #rule
IF OBJECT_ID('tempdb..#inst') IS NOT NULL DROP TABLE #inst

CREATE TABLE #obj
(
ManagedEntityId INT
)

CREATE TABLE #rule
(
RuleRowId INT,
ParentRuleRowId INT
)

CREATE TABLE #inst
(
PerformanceRuleInstanceRowId INT,
RuleRowId INT,
ObjectName NVARCHAR(256),
CounterName NVARCHAR(256),
InstanceName NVARCHAR(256),
ParentRuleRowId INT,
ParentPerformanceRuleInstanceRowId INT
)

CREATE TABLE #values
(
ManagedEntityId INT,
TopLevelHostManagedEntityId INT,
RuleRowId INT,
PerformanceRuleInstanceRowId INT,
ParentPerformanceRuleInstanceRowId INT,
IncludedObjectCount INT DEFAULT 1,
IncludedInstanceCount INT DEFAULT 1,
[TotalSampleCount] INT,
[TotalAverageValue] FLOAT,
[TotalSumValue] FLOAT,
[TotalMinValue] FLOAT,
[TotalMaxValue] FLOAT,
[TotalStandardDeviation] FLOAT,
[SortValue] FLOAT,
OptionXml XML,
CalcStage INT DEFAULT 1 -- 0 - raw values,
-- 1 - rule instances merged (if required), // no more merging
-- 2 - objects/instances merged (if required)
)

SET @SortOrder = CASE WHEN @SortOrder &lt; 0 THEN -1 ELSE 1 END

-- building object list
IF CONVERT(NVARCHAR(MAX),@ObjectList)='' SET @ObjectList=NULL

IF @ObjectList IS NOT NULL
BEGIN
INSERT INTO #obj
(
ManagedEntityId
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate,
@EndDate = @EndDate,
@ObjectList = @ObjectList,
@ForceContainment = @IsLinkedReport
END

-- building rules list // child rules
INSERT #rule (RuleRowId, ParentRuleRowId)
SELECT
vrc.RuleRowId, vr.RuleRowId
FROM
[dbo].[vRule] vr
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prp ON prp.RuleSystemName = vr.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prc ON prp.PerformanceRuleId=prc.ParentPerformanceRuleId
INNER JOIN [dbo].[vRule] vrc ON prc.RuleSystemName=vrc.RuleSystemName
WHERE vr.RuleGuid=@RuleId

-- building rules list // parent rule
INSERT #rule (RuleRowId, ParentRuleRowId)
SELECT
vrc.RuleRowId, vr.RuleRowId
FROM
[dbo].[vRule] vr
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prp ON prp.RuleSystemName = vr.RuleSystemName
INNER JOIN [dbo].[Veeam_GRL_PerformanceRule] prc ON prp.PerformanceRuleId=prc.ParentPerformanceRuleId
INNER JOIN [dbo].[vRule] vrc ON prc.RuleSystemName=vrc.RuleSystemName
WHERE vrc.RuleGuid=@RuleId AND vrc.RuleRowId NOT IN (SELECT r.RuleRowId FROM #rule r)

-- building rules list // master rule
INSERT #rule (RuleRowId)
SELECT vr.RuleRowId FROM [dbo].[vRule] vr WHERE vr.RuleGuid=@RuleId AND vr.RuleRowId NOT IN (SELECT r.RuleRowId FROM #rule r)

-- building rules list // parent is parent for itself if there is no parent
UPDATE #rule SET ParentRuleRowId = RuleRowId WHERE ParentRuleRowId IS NULL

-- building rule instance list
IF @InstanceList IS NULL OR convert(nvarchar(max),@InstanceList)=''
BEGIN
INSERT INTO #inst
(PerformanceRuleInstanceRowId, RuleRowId, ObjectName, CounterName, InstanceName, ParentRuleRowId)
SELECT
vpri.PerformanceRuleInstanceRowId, vr.RuleRowId, vpr.ObjectName, vpr.CounterName, vpri.InstanceName, r.ParentRuleRowId
FROM
[dbo].[vPerformanceRuleInstance] vpri
INNER JOIN [dbo].[vRule] vr ON vpri.RuleRowId = vr.RuleRowId
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
INNER JOIN #rule r ON r.RuleRowId = vr.RuleRowId
END
ELSE BEGIN
INSERT INTO #inst
(PerformanceRuleInstanceRowId, RuleRowId, ObjectName, CounterName, InstanceName, ParentRuleRowId)
SELECT
vpri.PerformanceRuleInstanceRowId, vr.RuleRowId, vpr.ObjectName, vpr.CounterName, vpri.InstanceName, r.ParentRuleRowId
FROM
[dbo].[vPerformanceRuleInstance] vpri
INNER JOIN [dbo].[vRule] vr ON vpri.RuleRowId = vr.RuleRowId
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
INNER JOIN @InstanceList.nodes('/Data/Values') AS InstanceList(InstanceName) ON
InstanceList.InstanceName.value('.', 'nvarchar(256)') =
vpri.InstanceName
INNER JOIN #rule r ON r.RuleRowId = vr.RuleRowId
END

-- building rule instance list // set parents
UPDATE ic
SET
ic.ParentPerformanceRuleInstanceRowId = ip.PerformanceRuleInstanceRowId
FROM
#inst ic
INNER JOIN #inst ip ON (ic.ParentRuleRowId=ip.RuleRowId AND ic.InstanceName=ip.InstanceName)

-- building rule instance list // parent is parent for itself if there is no parent
UPDATE #inst SET ParentPerformanceRuleInstanceRowId = PerformanceRuleInstanceRowId WHERE ParentPerformanceRuleInstanceRowId IS NULL

-- raw aggregated values
-- hourly
IF @DataAgg=0
BEGIN
INSERT INTO #values
(
ManagedEntityId,
TopLevelHostManagedEntityId,
PerformanceRuleInstanceRowId,
ParentPerformanceRuleInstanceRowId,
TotalSampleCount,
TotalAverageValue,
TotalSumValue,
TotalMinValue,
TotalMaxValue,
TotalStandardDeviation
)
SELECT
vpd.ManagedEntityRowId,
vme.TopLevelHostManagedEntityRowId,
vpd.PerformanceRuleInstanceRowId,
i.ParentPerformanceRuleInstanceRowId,
SUM(vpd.SampleCount),
SUM(vpd.SampleCount * vpd.AverageValue) / SUM(vpd.SampleCount),
SUM(vpd.SampleCount * vpd.AverageValue),
MIN(vpd.MinValue),
MAX(vpd.MaxValue),
SQRT(SUM(vpd.SampleCount * POWER(vpd.StandardDeviation, 2)) / SUM(vpd.SampleCount))
FROM
perf.vPerfHourly vpd
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = vpd.ManagedEntityRowId
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.PerformanceRuleInstanceRowId = vpd.PerformanceRuleInstanceRowId
INNER JOIN #inst i ON i.PerformanceRuleInstanceRowId = vpri.PerformanceRuleInstanceRowId
LEFT OUTER JOIN #obj o ON (o.ManagedEntityId=vme.ManagedEntityRowId)
WHERE
(o.ManagedEntityId IS NOT NULL OR @ObjectList IS NULL)
AND (vpd.DateTime &gt;= DATEADD(hh, DATEPART(hh, @StartDate), convert(varchar(8), @StartDate, 112)))
AND (vpd.DateTime &lt; DATEADD(hh, DATEPART(hh, @EndDate), convert(varchar(8), @EndDate, 112)))
GROUP BY
vpd.ManagedEntityRowId,
vme.TopLevelHostManagedEntityRowId,
vpd.PerformanceRuleInstanceRowId,
i.ParentPerformanceRuleInstanceRowId
END
ELSE
BEGIN
INSERT INTO #values
(
ManagedEntityId,
TopLevelHostManagedEntityId,
PerformanceRuleInstanceRowId,
ParentPerformanceRuleInstanceRowId,
TotalSampleCount,
TotalAverageValue,
TotalSumValue,
TotalMinValue,
TotalMaxValue,
TotalStandardDeviation
)
SELECT
vpd.ManagedEntityRowId,
vme.TopLevelHostManagedEntityRowId,
vpd.PerformanceRuleInstanceRowId,
i.ParentPerformanceRuleInstanceRowId,
SUM(vpd.SampleCount),
SUM(vpd.SampleCount * vpd.AverageValue) / SUM(vpd.SampleCount),
SUM(vpd.SampleCount * vpd.AverageValue),
MIN(vpd.MinValue),
MAX(vpd.MaxValue),
SQRT(SUM(vpd.SampleCount * POWER(vpd.StandardDeviation, 2)) / SUM(vpd.SampleCount))
FROM
perf.vPerfDaily vpd
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = vpd.ManagedEntityRowId
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.PerformanceRuleInstanceRowId = vpd.PerformanceRuleInstanceRowId
INNER JOIN #inst i ON i.PerformanceRuleInstanceRowId = vpri.PerformanceRuleInstanceRowId
LEFT OUTER JOIN #obj o ON (o.ManagedEntityId=vme.ManagedEntityRowId)
WHERE
(o.ManagedEntityId IS NOT NULL OR @ObjectList IS NULL)
AND (vpd.DateTime &gt;= CONVERT(DATETIME,CONVERT(VARCHAR(8), @StartDate, 112)))
AND (vpd.DateTime &lt; DATEADD(hour,24,CONVERT(DATETIME,CONVERT(VARCHAR(8), @EndDate, 112))))
GROUP BY
vpd.ManagedEntityRowId,
vme.TopLevelHostManagedEntityRowId,
vpd.PerformanceRuleInstanceRowId,
i.ParentPerformanceRuleInstanceRowId
END

---- merge tweak start

-- no more merge tweak

---- merge tweak end

-- Set RuleRowId
UPDATE v
SET RuleRowId = vpri.RuleRowId
FROM
#values v
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.PerformanceRuleInstanceRowId = v.PerformanceRuleInstanceRowId

-- group by object and instance - no aggregation required
IF @GroupBy='OI'
BEGIN
UPDATE #values SET CalcStage = 2 WHERE CalcStage=1
END
-- group by object - reaggregate
ELSE IF @GroupBy='O'
BEGIN
INSERT INTO #values
(
ManagedEntityId,
TopLevelHostManagedEntityId,
RuleRowId,
PerformanceRuleInstanceRowId,
ParentPerformanceRuleInstanceRowId,
TotalSampleCount,
TotalAverageValue,
TotalSumValue,
TotalMinValue,
TotalMaxValue,
TotalStandardDeviation,
IncludedObjectCount,
IncludedInstanceCount,
CalcStage
)
SELECT
v.ManagedEntityId,
v.TopLevelHostManagedEntityId,
v.RuleRowId,
NULL,
NULL,
SUM(v.TotalSampleCount),
SUM(v.TotalSampleCount * v.TotalAverageValue) / SUM(v.TotalSampleCount),
SUM(v.TotalSumValue),
MIN(v.TotalMinValue),
MAX(v.TotalMaxValue),
SQRT(SUM(v.TotalSampleCount * POWER(v.TotalStandardDeviation, 2)) / SUM(v.TotalSampleCount)),
1,
COUNT(1),
2
FROM
#values v
WHERE v.CalcStage=1
GROUP BY
v.ManagedEntityId,
v.TopLevelHostManagedEntityId,
v.RuleRowId
END
-- group by instance - reaggregate
ELSE IF @GroupBy='I'
BEGIN
INSERT INTO #values
(
ManagedEntityId,
TopLevelHostManagedEntityId,
RuleRowId,
PerformanceRuleInstanceRowId,
ParentPerformanceRuleInstanceRowId,
TotalSampleCount,
TotalAverageValue,
TotalSumValue,
TotalMinValue,
TotalMaxValue,
TotalStandardDeviation,
IncludedObjectCount,
IncludedInstanceCount,
CalcStage
)
SELECT
NULL,
NULL,
v.RuleRowId,
v.ParentPerformanceRuleInstanceRowId,
NULL,
SUM(v.TotalSampleCount),
SUM(v.TotalSampleCount * v.TotalAverageValue) / SUM(v.TotalSampleCount),
SUM(v.TotalSumValue),
MIN(v.TotalMinValue),
MAX(v.TotalMaxValue),
SQRT(SUM(v.TotalSampleCount * POWER(v.TotalStandardDeviation, 2)) / SUM(v.TotalSampleCount)),
COUNT(1),
1,
2
FROM
#values v
WHERE v.CalcStage=1
GROUP BY
v.RuleRowId,
v.ParentPerformanceRuleInstanceRowId
END

-- delete prvious stage data
DELETE FROM #values WHERE CalcStage=1

-- set sort value
UPDATE v
SET SortValue = CASE WHEN @SortFunction='SUM' THEN v.TotalSumValue
WHEN @SortFunction='MIN' THEN v.TotalMinValue
WHEN @SortFunction='MAX' THEN v.TotalMaxValue
ELSE v.TotalAverageValue END
FROM #values v

-- combine OptionXml required for drilldowns
UPDATE v
SET OptionXml = '&lt;Value&gt;&lt;Object Use="Self"&gt;'+CONVERT(NVARCHAR(MAX),v.ManagedEntityId)+'&lt;/Object&gt;&lt;Rule&gt;'+@RuleId+'&lt;/Rule&gt;&lt;/Value&gt;'
FROM
#values v
WHERE v.CalcStage=2 AND v.ManagedEntityId IS NOT NULL

UPDATE v
SET OptionXml.modify('insert &lt;Instance&gt;{ sql:column("vpri.InstanceName") }&lt;/Instance&gt; as last into (/Value)[1]')
FROM
#values v
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.PerformanceRuleInstanceRowId = v.PerformanceRuleInstanceRowId
WHERE OptionXml IS NOT NULL AND v.PerformanceRuleInstanceRowId IS NOT NULL

-- final recordset
SELECT TOP ( @TopCount ) WITH TIES
RowNumber = ROW_NUMBER() OVER (ORDER BY v.SortValue*@SortOrder DESC),
vmet.ManagedEntityTypeRowId, vmet.ManagedEntityTypeSystemName, vmet.ManagedEntityTypeDefaultName,
vmeti.[Image],
vme.ManagedEntityRowId, vme.[Path], vme.Name, vme.DisplayName,
vr.RuleRowId, vr.RuleSystemName, vr.RuleDefaultName,
vpr.ObjectName, vpr.CounterName,
vpri.InstanceName,
v.IncludedObjectCount, v.IncludedInstanceCount,
v.TotalSampleCount,
v.TotalAverageValue,
v.TotalSumValue,
TotalMinValue = CASE WHEN @SortFunction='SUM' THEN NULL ELSE v.TotalMinValue END ,
TotalMaxValue = CASE WHEN @SortFunction='SUM' THEN NULL ELSE v.TotalMaxValue END,
v.TotalStandardDeviation,
v.SortValue,
DataAgg=@DataAgg,
SortFunction=@SortFunction,
MeasurementUnitName = @MeasurementUnit,
v.OptionXml
FROM
#values v
INNER JOIN [dbo].[vRule] vr ON vr.RuleRowId = v.RuleRowId
INNER JOIN [dbo].[vPerformanceRule] vpr ON vpr.RuleRowId = vr.RuleRowId
LEFT OUTER JOIN [dbo].[vManagedEntity] vme ON v.ManagedEntityId=vme.ManagedEntityRowId
LEFT OUTER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] vmeti ON vmeti.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId AND vmeti.ImageCategory = N'u16x16Icon'
LEFT OUTER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.PerformanceRuleInstanceRowId = v.PerformanceRuleInstanceRowId
WHERE v.CalcStage=2
ORDER BY (v.SortValue*@SortOrder) DESC

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#rule') IS NOT NULL DROP TABLE #rule
IF OBJECT_ID('tempdb..#inst') IS NOT NULL DROP TABLE #inst
END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#rule') IS NOT NULL DROP TABLE #rule
IF OBJECT_ID('tempdb..#inst') IS NOT NULL DROP TABLE #inst

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_PerformanceTopGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_AlertStatsGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_AlertStatsGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_AlertStatsGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_AlertStatsGet]
@MPList XML,
@pStartDate DATETIME,
@pEndDate DATETIME,
@pStartDate2 DATETIME,
@pEndDate2 DATETIME,
@ObjectList XML = NULL,
@ManagedEntityTypeSystemName NVARCHAR(MAX) = NULL
AS
BEGIN

SET NOCOUNT ON

BEGIN TRY
declare @StartDate DATETIME,
@EndDate DATETIME,
@StartDate2 DATETIME,
@EndDate2 DATETIME

select
@StartDate=@pStartDate,
@EndDate=@pEndDate,
@StartDate2=@pStartDate2,
@EndDate2=@pEndDate2

if @EndDate2 is null set @StartDate2 = null

DECLARE @TotalAlerts numeric(10,4)
DECLARE @TotalAlerts2 numeric(10,4)

if object_id('tempdb..#tmpMPList') is not null drop table #tmpMPList
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
if object_id('tempdb..#tmpAlertList') is not null drop table #tmpAlertList
if object_id('tempdb..#tmpAlertsByEnt') is not null drop table #tmpAlertsByEnt
if object_id('tempdb..#tmpTotalsByEnt') is not null drop table #tmpTotalsByEnt
if object_id('tempdb..#tmpTotalsByAlert') is not null drop table #tmpTotalsByAlert

CREATE TABLE #tmpMPList (ManagementPackRowId INT)

CREATE TABLE #obj ( ManagedEntityId INT )

CREATE TABLE #tmpAlertList
(
AlertGuid UNIQUEIDENTIFIER,
AlertPeriod TINYINT,
ManagedEntityRowId INT
)
CREATE TABLE #tmpAlertsByEnt
(
WorkflowRowId int,
IsMonitorWorkflow INT,
AlertName varchar(max),
ManagedEntityRowId int,
RepeatCount int,
RepeatCount2 int,
RowNum int,
MonitorGuid uniqueidentifier,
RuleGuid uniqueidentifier,
ManagementPackRowId int
)

CREATE TABLE #tmpTotalsByEnt
(
ManagedEntityRowId int,
AlertsCount int,
ActivityPct numeric(10,4),
TopTroublemakersRank INT,
AlertsCount2 int,
ActivityPct2 numeric(10,4)
)

CREATE TABLE #tmpTotalsByAlert
(
WorkflowRowId int,
AlertName varchar(max),
ManagementPackRowId int,
MonitorGuid uniqueidentifier,
RuleGuid uniqueidentifier,
TopAlertsRank INT,
AlertsCount int,
ActivityPct numeric(10,4),
AlertsCount2 int,
ActivityPct2 numeric(10,4)
)

INSERT INTO #tmpMPList (ManagementPackRowId)
SELECT ObjectList.ManagementPackRowId.value('.', 'int')
FROM @MPList.nodes('/Data/Values') AS ObjectList(ManagementPackRowId)

DECLARE @o TABLE (id INT)

IF @ManagedEntityTypeSystemName IS NOT NULL AND @ManagedEntityTypeSystemName&lt;&gt;'System.Entity'
BEGIN
DECLARE @METId INT
SELECT @METId=vmet.ManagedEntityTypeRowId FROM [dbo].[vManagedEntityType] vmet WHERE vmet.ManagedEntityTypeSystemName=@ManagedEntityTypeSystemName

INSERT INTO @o
(
id
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate,
@EndDate = @EndDate,
@ObjectList = NULL,
@ManagedEntityTypeFilterRowId=@METId,
@ForceContainment = 1,
@HostedOnly =1

INSERT INTO @o
(
id
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate2,
@EndDate = @EndDate2,
@ObjectList = NULL,
@ManagedEntityTypeFilterRowId=@METId,
@ForceContainment = 1,
@HostedOnly =1

END
ELSE IF @ObjectList IS NOT NULL
BEGIN
INSERT INTO @o
(
id
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate,
@EndDate = @EndDate,
@ObjectList = @ObjectList,
@ForceContainment = 0

INSERT INTO @o
(
id
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate2,
@EndDate = @EndDate2,
@ObjectList = @ObjectList,
@ForceContainment = 0

END

INSERT INTO #obj
(
ManagedEntityId
)
SELECT DISTINCT id FROM @o

INSERT INTO #tmpAlertList ( AlertGuid, AlertPeriod, ManagedEntityRowId )
SELECT DISTINCT
vAlert.AlertGuid,
case when (vAlert.RaisedDateTime &gt;= @StartDate) AND (vAlert.RaisedDateTime &lt; @EndDate) then 1
when (vAlert.RaisedDateTime &gt;= @StartDate2) AND (vAlert.RaisedDateTime &lt; @EndDate2) then 2
else null END,
vAlert.ManagedEntityRowId

FROM
Alert.vAlert vAlert
LEFT OUTER JOIN dbo.vMonitor vMonitor ON (vAlert.WorkflowRowId = vMonitor.MonitorRowId)
AND (vAlert.MonitorAlertInd = 1)
LEFT OUTER JOIN dbo.vRule vRule ON (vAlert.WorkflowRowId = vRule.RuleRowId)
AND (vAlert.MonitorAlertInd = 0)
INNER JOIN dbo.vManagementPack vMP ON (CASE
WHEN vAlert.MonitorAlertInd = 1 THEN vMonitor.ManagementPackRowId
ELSE vRule.ManagementPackRowId
END) = vMP.ManagementPackRowId
INNER JOIN #tmpMPList ON vMP.ManagementPackRowId = #tmpMPList.ManagementPackRowId
WHERE
--Filter by datetime
( (vAlert.RaisedDateTime &gt;= @StartDate) AND (vAlert.RaisedDateTime &lt; @EndDate) ) OR
( (vAlert.RaisedDateTime &gt;= @StartDate2) AND (vAlert.RaisedDateTime &lt; @EndDate2) )

INSERT INTO #tmpAlertList ( AlertGuid, AlertPeriod, ManagedEntityRowId )
SELECT DISTINCT tal.AlertGuid, 2, tal.ManagedEntityRowId
FROM
#tmpAlertList tal
INNER JOIN Alert.vAlert va ON va.AlertGuid = tal.AlertGuid
WHERE
tal.AlertPeriod=1
AND (va.RaisedDateTime &gt;= @StartDate2) AND (va.RaisedDateTime &lt; @EndDate2)

IF @ObjectList IS NOT NULL OR @ManagedEntityTypeSystemName IS NOT NULL
BEGIN
DELETE FROM #tmpAlertList WHERE ManagedEntityRowId NOT IN (SELECT o.ManagedEntityId FROM #obj o)
END

SET @TotalAlerts = (SELECT COUNT(*) FROM #tmpAlertList where AlertPeriod=1)
SET @TotalAlerts2 = (SELECT COUNT(*) FROM #tmpAlertList where AlertPeriod=2)

insert into #tmpAlertsByEnt (WorkflowRowId, IsMonitorWorkflow, AlertName, ManagedEntityRowId, RepeatCount, RepeatCount2, RowNum, MonitorGuid, RuleGuid, ManagementPackRowId)
SELECT
subAlerts.WorkflowRowId,
CAST(subAlerts.MonitorAlertInd AS INT),
subAlerts.AlertName,
subAlerts.ManagedEntityRowId,
SUM(case when #tmpAlertList.AlertPeriod=1 then 1 else 0 end) AS RepeatCount,
SUM(case when #tmpAlertList.AlertPeriod=2 then 1 else 0 end) AS RepeatCount2,
RowNum = DENSE_RANK() OVER(PARTITION BY subAlerts.ManagedEntityRowId ORDER BY COUNT(*) DESC),
vMonitor.MonitorGuid,
vRule.RuleGuid,
vMP.ManagementPackRowId
FROM
Alert.vAlert subAlerts
INNER JOIN #tmpAlertList ON subAlerts.AlertGuid = #tmpAlertList.AlertGuid
LEFT OUTER JOIN dbo.vMonitor vMonitor ON (subAlerts.WorkflowRowId = vMonitor.MonitorRowId) AND (subAlerts.MonitorAlertInd = 1)
LEFT OUTER JOIN dbo.vRule vRule ON (subAlerts.WorkflowRowId = vRule.RuleRowId) AND (subAlerts.MonitorAlertInd = 0)
INNER JOIN dbo.vManagementPack vMP ON (CASE
WHEN subAlerts.MonitorAlertInd = 1 THEN vMonitor.ManagementPackRowId
ELSE vRule.ManagementPackRowId
END) = vMP.ManagementPackRowId
GROUP BY
subAlerts.WorkflowRowId,
subAlerts.MonitorAlertInd,
subAlerts.AlertName,
subAlerts.ManagedEntityRowId,
vMP.ManagementPackRowId,
vMonitor.MonitorGuid,
vRule.RuleGuid

IF @ObjectList IS NOT NULL
BEGIN
DELETE FROM #tmpAlertsByEnt WHERE ManagedEntityRowId NOT IN (SELECT o.ManagedEntityId FROM #obj o)
END

insert into #tmpTotalsByEnt (ManagedEntityRowId, AlertsCount, ActivityPct, AlertsCount2, ActivityPct2)
select
TopLevelHostManagedEntityRowId,
Sum(RepeatCount),
case when ISNULL(@TotalAlerts,0) &lt;&gt; 0 then convert(decimal,Sum(RepeatCount))/@TotalAlerts else 0 end,
Sum(RepeatCount2),
case when ISNULL(@TotalAlerts2,0) &lt;&gt; 0 then convert(decimal,Sum(RepeatCount2))/@TotalAlerts2 else 0 end
from
#tmpAlertsByEnt t inner join
dbo.vManagedEntity me on t.ManagedEntityRowId=me.ManagedEntityRowId
group by TopLevelHostManagedEntityRowId

UPDATE te
SET te.TopTroublemakersRank = tt.TopTroublemakersRank
FROM
#tmpTotalsByEnt te
INNER JOIN
(
SELECT
t.ManagedEntityRowId,
TopTroublemakersRank = ROW_NUMBER() OVER (ORDER BY t.ActivityPct DESC)
FROM
#tmpTotalsByEnt t
) tt ON te.ManagedEntityRowId=tt.ManagedEntityRowId

insert into #tmpTotalsByAlert
(
WorkflowRowId,
AlertName,
ManagementPackRowId,
MonitorGuid,
RuleGuid,
AlertsCount,
ActivityPct,
AlertsCount2,
ActivityPct2
)
select
WorkflowRowId,
AlertName,
ManagementPackRowId,
MonitorGuid,
RuleGuid,
Sum(RepeatCount),
case when ISNULL(@TotalAlerts,0) &lt;&gt; 0 then convert(decimal,Sum(RepeatCount))/@TotalAlerts else 0 end,
Sum(RepeatCount2),
case when ISNULL(@TotalAlerts2,0) &lt;&gt; 0 then convert(decimal,Sum(RepeatCount2))/@TotalAlerts2 else 0 end
from
#tmpAlertsByEnt t
group by
WorkflowRowId,
AlertName,
ManagementPackRowId,
MonitorGuid,
RuleGuid

UPDATE ta
SET ta.TopAlertsRank = x.TopAlertsRank
FROM
#tmpTotalsByAlert ta
INNER JOIN
(
SELECT
t.WorkflowRowId, t.AlertName,
TopAlertsRank = ROW_NUMBER() OVER (ORDER BY t.ActivityPct DESC)
FROM
#tmpTotalsByAlert t
) x ON ta.WorkflowRowId=x.WorkflowRowId AND ta.AlertName=x.AlertName

SELECT
TopManagedEntityRowId = met.ManagedEntityRowId,
TopDisplayName=met.DisplayName,
me.Path,
me.DisplayName,
_vAlert.WorkflowRowId,
_vAlert.IsMonitorWorkflow,
_vAlert.AlertName,
_vAlert.ManagedEntityRowId,
vMP.ManagementPackDefaultName,
vMP.ManagementPackDefaultDescription,
TriggerDeafultName=case when vMonitor.MonitorDefaultName is not null then N'M: '+vMonitor.MonitorDefaultName else N'R: '+vRule.RuleDefaultName end,
TriggerSystemName=case when vMonitor.MonitorSystemName is not null then N'M: '+vMonitor.MonitorSystemName else N'R: '+vRule.RuleSystemName end,
_vAlert.RepeatCount,
AlertsCountEnt=te.AlertsCount,
CASE
WHEN ISNULL(te.AlertsCount,0) &lt;&gt; 0 THEN convert(numeric(10,4),convert(decimal,_vAlert.RepeatCount)/te.AlertsCount)
ELSE 0
END AS ActivityPctEnt,
AlertsCountAlert=ta.AlertsCount,
CASE
WHEN ISNULL(ta.AlertsCount,0) &lt;&gt; 0 THEN convert(numeric(10,4),convert(decimal,_vAlert.RepeatCount)/ta.AlertsCount)
ELSE 0
END AS ActivityPctAlert,
_vAlert.RepeatCount2,
AlertsCountEnt2=te.AlertsCount2,
CASE
WHEN ISNULL(te.AlertsCount2,0) &lt;&gt; 0 THEN convert(numeric(10,4),convert(decimal,_vAlert.RepeatCount2)/te.AlertsCount2)
ELSE 0
END AS ActivityPctEnt2,
AlertsCountAlert2=ta.AlertsCount2,
CASE
WHEN ISNULL(ta.AlertsCount2,0) &lt;&gt; 0 THEN convert(numeric(10,4),convert(decimal,_vAlert.RepeatCount2)/ta.AlertsCount2)
ELSE 0
END AS ActivityPctAlert2,
_vAlert.RowNum,
AlertActivityPct = ta.ActivityPct,
AlertActivityPct2 = ta.ActivityPct2,
EntActivityPct = te.ActivityPct,
EntActivityPct2 = te.ActivityPct2,
vmeti.[Image],
te.TopTroublemakersRank,
ta.TopAlertsRank
FROM
#tmpAlertsByEnt AS _vAlert
LEFT OUTER JOIN dbo.vMonitor vMonitor ON _vAlert.MonitorGuid = vMonitor.MonitorGuid
LEFT OUTER JOIN dbo.vRule vRule ON _vAlert.RuleGuid = vRule.RuleGuid
INNER JOIN dbo.vManagementPack vMP ON _vAlert.ManagementPackRowId = vMP.ManagementPackRowId
inner join [dbo].[vManagedEntity] me on _vAlert.ManagedEntityRowId=me.ManagedEntityRowId
inner join #tmpTotalsByEnt te on me.TopLevelHostManagedEntityRowId = te.ManagedEntityRowId
inner join #tmpTotalsByAlert ta on _vAlert.WorkflowRowId = ta.WorkflowRowId AND _vAlert.AlertName = ta.AlertName
inner join [dbo].[vManagedEntity] met on te.ManagedEntityRowId=met.ManagedEntityRowId
LEFT OUTER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = met.ManagedEntityTypeRowId
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] vmeti ON vmeti.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId AND vmeti.ImageCategory = N'u16x16Icon'

ORDER BY ta.WorkflowRowId

if object_id('tempdb..#tmpMPList') is not null drop table #tmpMPList
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
if object_id('tempdb..#tmpAlertList') is not null drop table #tmpAlertList
if object_id('tempdb..#tmpAlertsByEnt') is not null drop table #tmpAlertsByEnt
if object_id('tempdb..#tmpTotalsByEnt') is not null drop table #tmpTotalsByEnt
if object_id('tempdb..#tmpTotalsByAlert') is not null drop table #tmpTotalsByAlert

END TRY
BEGIN CATCH
if object_id('tempdb..#tmpMPList') is not null drop table #tmpMPList
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
if object_id('tempdb..#tmpAlertList') is not null drop table #tmpAlertList
if object_id('tempdb..#tmpAlertsByEnt') is not null drop table #tmpAlertsByEnt
if object_id('tempdb..#tmpTotalsByEnt') is not null drop table #tmpTotalsByEnt
if object_id('tempdb..#tmpTotalsByAlert') is not null drop table #tmpTotalsByAlert

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_AlertStatsGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_AlertHistoryGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_AlertHistoryGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_AlertHistoryGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_AlertHistoryGet]
@MPList XML,
@pStartDate DATETIME,
@pEndDate DATETIME,
@ObjectList XML,
@SeverityList XML,
@PriorityList XML,
@WorkflowId INT = -1,
@IsMonitorWorkflow INT = -1 ,
@ManagedEntityType NVARCHAR(512)='System.Entity',
@LimitScopeToHostedOnly BIT = 0
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY
if object_id('tempdb..#tmpMPList') is not null drop table #tmpMPList
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj

CREATE TABLE #tmpMPList (ManagementPackRowId INT)

CREATE TABLE #obj (ManagedEntityRowId INT)

INSERT INTO #tmpMPList (ManagementPackRowId)
SELECT ObjectList.ManagementPackRowId.value('.', 'int')
FROM @MPList.nodes('/Data/Values') AS ObjectList(ManagementPackRowId)

DECLARE @ObjXml XML

IF @ManagedEntityType IS NOT NULL AND @ManagedEntityType&lt;&gt;'System.Entity' AND cast(@ObjectList AS NVARCHAR(MAX))='&lt;Data/&gt;'
BEGIN
DECLARE @METId INT
SELECT @METId=vmet.ManagedEntityTypeRowId FROM [dbo].[vManagedEntityType] vmet WHERE vmet.ManagedEntityTypeSystemName=@ManagedEntityType

EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @pStartDate,
@EndDate = @pEndDate,
@ObjectList = NULL,
@ManagedEntityTypeFilterRowId=@METId,
@ForceContainment = 1,
@HostedOnly =1,
@XmlOutputOnly=1,
@OutputXml=@ObjXml OUT
END
ELSE BEGIN
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @pStartDate,
@EndDate = @pEndDate,
@ObjectList = @ObjectList,
@ForceContainment = 0,
@HostedOnly = @LimitScopeToHostedOnly,
@XmlOutputOnly = 1,
@OutputXml = @ObjXml OUT
END

IF @ObjXml IS NOT NULL
BEGIN
INSERT #obj (ManagedEntityRowId)
SELECT
o.n.value('.','int')
FROM
@ObjXml.nodes('/Objects/Object/ManagedEntityRowId') AS o(n)
END

SELECT
va.AlertGuid,
va.AlertName,
va.AlertDescription,
va.WorkflowRowId,
va.MonitorAlertInd,
va.RaisedDateTime,
RaisedDateHour = DATEADD(hh, DATEPART(hh, RaisedDateTime), convert(varchar(8), RaisedDateTime, 112)),
Severity = CASE va.Severity
WHEN 0 THEN 'Information'
WHEN 1 THEN 'Warning'
WHEN 2 THEN 'Critical'
ELSE NULL
END,
Priority = CASE va.Priority
WHEN 0 THEN 'Low'
WHEN 1 THEN 'Medium'
WHEN 2 THEN 'High'
ELSE NULL
END,
va.RepeatCount,

vmet.ManagedEntityTypeDefaultName,
vmeti.[Image],
va.ManagedEntityRowId,
vme.DisplayName,
vme.[Path],

WorkflowName = ISNULL('M: '+vm.MonitorDefaultName,'R: '+vr.RuleDefaultName),

mp.ManagementPackRowId

FROM
alert.vAlert va
INNER JOIN #obj o ON o.ManagedEntityRowId = va.ManagedEntityRowId
INNER JOIN @SeverityList.nodes('/Data/Values') AS s(n) ON va.Severity=s.n.value('.','tinyint')
INNER JOIN @PriorityList.nodes('/Data/Values') AS p(n) ON va.Priority=p.n.value('.','tinyint')
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = va.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
LEFT OUTER JOIN [dbo].[vRule] vr ON vr.RuleRowId=va.WorkflowRowId AND va.MonitorAlertInd=0
LEFT OUTER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId=va.WorkflowRowId AND va.MonitorAlertInd=1
LEFT OUTER JOIN #tmpMPList mp ON mp.ManagementPackRowId=vr.ManagementPackRowId OR mp.ManagementPackRowId=vm.ManagementPackRowId
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] vmeti ON vmeti.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId AND vmeti.ImageCategory = N'u16x16Icon'
WHERE
va.RaisedDateTime BETWEEN @pStartDate AND @pEndDate
AND (va.WorkflowRowId=@WorkflowId OR @WorkflowId=-1)
AND (va.MonitorAlertInd=CAST(@IsMonitorWorkflow AS BIT) OR @IsMonitorWorkflow=-1 )
AND mp.ManagementPackRowId IS NOT NULL

if object_id('tempdb..#tmpMPList') is not null drop table #tmpMPList
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
END TRY
BEGIN CATCH
if object_id('tempdb..#tmpMPList') is not null drop table #tmpMPList
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_AlertHistoryGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_ManagedEntityTypesGetByReport_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ManagedEntityTypesGetByReport')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ManagedEntityTypesGetByReport] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_ManagedEntityTypesGetByReport]
@ReportSystemName NVARCHAR(256)
AS
BEGIN

DECLARE @OptionsXml XML

SELECT @OptionsXml=vgr.Options
FROM [dbo].[Veeam_GRL_Report] vgr
WHERE vgr.ReportSystemName=@ReportSystemName

DECLARE @res TABLE
(
ManagedEntityTypeSystemName NVARCHAR(256),
ManagedEntityTypeDefaultName NVARCHAR(256)
)

INSERT INTO @res
(
ManagedEntityTypeSystemName,
ManagedEntityTypeDefaultName
)
SELECT
vmet.ManagedEntityTypeSystemName,
vmet.ManagedEntityTypeDefaultName
FROM
@OptionsXml.nodes('/ManagedEntityTypes/ManagedEntityType') AS o(t)
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeSystemName=o.t.value('@SystemName','nvarchar(256)')

IF NOT EXISTS (SELECT TOP 1 1 FROM @res)
BEGIN
INSERT INTO @res
(
ManagedEntityTypeSystemName,
ManagedEntityTypeDefaultName
)
SELECT
vmet.ManagedEntityTypeSystemName,
vmet.ManagedEntityTypeDefaultName
FROM
[dbo].[vManagedEntityType] vmet
WHERE vmet.ManagedEntityTypeSystemName='System.Entity'
END

SELECT * FROM @res r

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ManagedEntityTypesGetByReport] TO OpsMgrReader
GO-- ##### Veeam_GRL_ManagedEntityTypesGetByScope_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ManagedEntityTypesGetByScope')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ManagedEntityTypesGetByScope] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_ManagedEntityTypesGetByScope]
@ObjectList XML,
@NoOutput BIT = 0,
@res XML = NULL OUT
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#meType') IS NOT NULL DROP TABLE #meType
IF OBJECT_ID('tempdb..#out') IS NOT NULL DROP TABLE #out

CREATE TABLE #obj
(
ManagedEntityRowId INT
)

CREATE TABLE #meType
(
ManagedEntityTypeRowId INT,
BaseManagedEntityTypeRowId INT
)

CREATE TABLE #out
(
ManagedEntityTypeRowId INT,
SystemName NVARCHAR(512),
NestPath NVARCHAR(MAX),
NestIdPath XML,
DisplayName NVARCHAR(512)
)

INSERT INTO #obj (ManagedEntityRowId)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = null,
@EndDate = null,
@ObjectList = @ObjectList,
@ForceContainment = 0,
@ManagedEntityTypeRowId = null,
@MaxLevel = null,
@XPathType = NULL

DECLARE @rCount int

INSERT #meType (ManagedEntityTypeRowId, BaseManagedEntityTypeRowId)
SELECT DISTINCT
vme.ManagedEntityTypeRowId, tv.BaseManagedEntityTypeRowId
FROM
#obj o
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityTypeManagementPackVersion] tv ON tv.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId

SET @rCount=@@ROWCOUNT

-- we return System.Entity for empty scope
IF @rCount=0
BEGIN
INSERT #meType (ManagedEntityTypeRowId, BaseManagedEntityTypeRowId)
SELECT DISTINCT
vmet.ManagedEntityTypeRowId, vmetmpv.BaseManagedEntityTypeRowId
FROM
[dbo].[vManagedEntityType] vmet
INNER JOIN [dbo].[vManagedEntityTypeManagementPackVersion] vmetmpv ON vmetmpv.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId
WHERE
vmet.ManagedEntityTypeSystemName='System.Entity'

SET @rCount=@@ROWCOUNT
END

WHILE @rCount&gt;0
BEGIN
INSERT #meType (ManagedEntityTypeRowId, BaseManagedEntityTypeRowId)
SELECT DISTINCT tv.ManagedEntityTypeRowId, tv.BaseManagedEntityTypeRowId
FROM
#meType mt
INNER JOIN [dbo].[vManagedEntityTypeManagementPackVersion] tv ON mt.BaseManagedEntityTypeRowId=tv.ManagedEntityTypeRowId
WHERE tv.ManagedEntityTypeRowId NOT IN (SELECT #meType.ManagedEntityTypeRowId FROM #meType)

SET @rCount=@@ROWCOUNT
END;

WITH cte (BaseManagedEntityTypeRowId, ManagedEntityTypeRowId, NestLevel, NestPath, NestIdPath, DisplayName, SystemName)
AS
(
SELECT
mt.BaseManagedEntityTypeRowId,
mt.ManagedEntityTypeRowId,
0,
CONVERT(VARCHAR(MAX),'/'+CONVERT(VARCHAR(64),vmet.ManagedEntityTypeDefaultName)),
CONVERT(VARCHAR(MAX),'&lt;Id&gt;'+CONVERT(VARCHAR(64),vmet.ManagedEntityTypeRowId)+'&lt;/Id&gt;'),
vmet.ManagedEntityTypeDefaultName,
vmet.ManagedEntityTypeSystemName
FROM
#meType mt
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = mt.ManagedEntityTypeRowId
WHERE mt.BaseManagedEntityTypeRowId IS NULL
UNION ALL
SELECT
mt.BaseManagedEntityTypeRowId,
mt.ManagedEntityTypeRowId,
cte.NestLevel+1,
cte.NestPath+'/'+CONVERT(VARCHAR(64),vmet.ManagedEntityTypeDefaultName),
cte.NestIdPath+'&lt;Id&gt;'+CONVERT(VARCHAR(64),vmet.ManagedEntityTypeRowId)+'&lt;/Id&gt;',
vmet.ManagedEntityTypeDefaultName,
vmet.ManagedEntityTypeSystemName
FROM
#meType mt
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = mt.ManagedEntityTypeRowId
INNER JOIN cte cte ON mt.BaseManagedEntityTypeRowId=cte.ManagedEntityTypeRowId

)
INSERT INTO #out
(
ManagedEntityTypeRowId,
SystemName,
NestPath,
NestIdPath,
DisplayName
)
SELECT
t.ManagedEntityTypeRowId,
t.SystemName,
t.NestPath,
NestIdPath=convert(xml,t.NestIdPath),
DisplayName = REPLICATE('-',t.NestLevel)+CASE WHEN t.NestLevel&gt;0 THEN ' ' ELSE '' END+t.DisplayName
FROM cte t
ORDER BY t.NestPath

SET @res = (SELECT o.ManagedEntityTypeRowId, NestIdPath FROM #out o FOR XML RAW('r'))

IF @NoOutput=0
SELECT * FROM #out

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#meType') IS NOT NULL DROP TABLE #meType
IF OBJECT_ID('tempdb..#out') IS NOT NULL DROP TABLE #out
END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#meType') IS NOT NULL DROP TABLE #meType
IF OBJECT_ID('tempdb..#out') IS NOT NULL DROP TABLE #out

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ManagedEntityTypesGetByScope] TO OpsMgrReader
GO-- ##### Veeam_GRL_MonitorsGetByManagedEntityType_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_MonitorsGetByManagedEntityType')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_MonitorsGetByManagedEntityType] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_MonitorsGetByManagedEntityType]
@ManagedEntityTypeSystemName NVARCHAR(512)
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY
IF OBJECT_ID('tempdb..#meType') IS NOT NULL DROP TABLE #meType
IF OBJECT_ID('tempdb..#monitor') IS NOT NULL DROP TABLE #monitor

CREATE TABLE #meType
(
ManagedEntityTypeRowId INT,
BaseManagedEntityTypeRowId INT
)

CREATE TABLE #monitor
(
MonitorRowId INT,
ParentMonitorRowId INT
)

DECLARE @rCount int

INSERT INTO #meType
(
ManagedEntityTypeRowId,
BaseManagedEntityTypeRowId
)
SELECT DISTINCT
tv.ManagedEntityTypeRowId,
tv.BaseManagedEntityTypeRowId
FROM
[dbo].[vManagedEntityTypeManagementPackVersion] tv
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = tv.ManagedEntityTypeRowId
WHERE
vmet.ManagedEntityTypeSystemName=@ManagedEntityTypeSystemName

SET @rCount=@@ROWCOUNT

WHILE @rCount&gt;0
BEGIN
INSERT #meType (ManagedEntityTypeRowId, BaseManagedEntityTypeRowId)
SELECT DISTINCT tv.ManagedEntityTypeRowId, tv.BaseManagedEntityTypeRowId
FROM
#meType mt
INNER JOIN [dbo].[vManagedEntityTypeManagementPackVersion] tv ON mt.BaseManagedEntityTypeRowId=tv.ManagedEntityTypeRowId
WHERE tv.ManagedEntityTypeRowId NOT IN (SELECT #meType.ManagedEntityTypeRowId FROM #meType)

SET @rCount=@@ROWCOUNT
END

SET @rCount=0

INSERT INTO #monitor
(
MonitorRowId,
ParentMonitorRowId
)
SELECT DISTINCT
mv.MonitorRowId, mv.ParentMonitorRowId
FROM
#meType mt
INNER JOIN [dbo].[vMonitorManagementPackVersion] mv ON mt.ManagedEntityTypeRowId=mv.TargetManagedEntityTypeRowId
INNER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId = mv.MonitorRowId

SET @rCount=@@ROWCOUNT

WHILE @rCount&gt;0
BEGIN
INSERT INTO #monitor
(
MonitorRowId,
ParentMonitorRowId
)
SELECT DISTINCT
mv.MonitorRowId, mv.ParentMonitorRowId
FROM
#meType mt
INNER JOIN [dbo].[vMonitorManagementPackVersion] mv ON mt.ManagedEntityTypeRowId=mv.TargetManagedEntityTypeRowId
INNER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId = mv.MonitorRowId
INNER JOIN #monitor m ON vm.MonitorRowId=m.ParentMonitorRowId
WHERE vm.MonitorRowId NOT IN (SELECT #monitor.MonitorRowId FROM #monitor)

SET @rCount=@@ROWCOUNT
END;

WITH cte (MonitorRowId, NestLevel, NestPath, DisplayName, SystemName)
AS
(
SELECT
vm.MonitorRowId,
0,
CONVERT(VARCHAR(MAX),'/'+CONVERT(VARCHAR(64),vm.MonitorDefaultName)),
vm.MonitorDefaultName,
vm.MonitorSystemName
FROM
#monitor m
INNER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId = m.MonitorRowId
WHERE
m.ParentMonitorRowId IS NULL
UNION ALL
SELECT
vm.MonitorRowId,
c.NestLevel+1,
c.NestPath+'/'+CONVERT(VARCHAR(64),vm.MonitorDefaultName),
vm.MonitorDefaultName,
vm.MonitorSystemName
FROM
cte c
INNER JOIN #monitor m ON m.ParentMonitorRowId=c.MonitorRowId
INNER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId = m.MonitorRowId
)
SELECT
c.MonitorRowId,
c.SystemName,
c.NestPath,
DisplayName = REPLICATE('-',c.NestLevel)+CASE WHEN c.NestLevel&gt;0 THEN ' ' ELSE '' END+c.DisplayName
FROM
cte c
ORDER BY c.NestPath

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

END TRY
BEGIN CATCH

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

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_MonitorsGetByManagedEntityType] TO OpsMgrReader
GO-- ##### Veeam_GRL_StateGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_StateGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_StateGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_StateGet]
@pStartDate datetime,
@pEndDate datetime,
@pStartDate2 datetime,
@pEndDate2 datetime,
@ObjectList XML,
@ManagedEntityTypeSystemName NVARCHAR(512),
@MonitorSystemName NVARCHAR(512),
@DataAgg TINYINT, -- 1 = daily, others = hourly
@UnhealthyStateList XML, -- States:
-- 1 - Critical - red
-- 2 - Warning - yellow
-- 4 - Healthy - green
-- 8 - Unmonitored - white
-- 16 - Monitor disabled - silver
-- 32 - Monitoring unavailable - gray
-- 64 - Unplanned maintenance - black
-- 128 - Planned maintenance - blue
@MaxMonitorsLimit INT = 1000,
@NoNestedMonitors BIT = 0,
@NoDetails BIT = 1,
@ManagedEntityMonitorRowId INT = NULL,
@XmlOutputOnly BIT = 0,
@OutputXml XML = NULL OUT
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY
IF OBJECT_ID('tempdb..#objlist') IS NOT NULL DROP TABLE #objlist
IF OBJECT_ID('tempdb..#mType') IS NOT NULL DROP TABLE #mType
IF OBJECT_ID('tempdb..#meMonitor') IS NOT NULL DROP TABLE #meMonitor
IF OBJECT_ID('tempdb..#stateRaw') IS NOT NULL DROP TABLE #stateRaw
IF OBJECT_ID('tempdb..#artificialIntervals') IS NOT NULL DROP TABLE #artificialIntervals
IF OBJECT_ID('tempdb..#artificialIntervalsStepped') IS NOT NULL DROP TABLE #artificialIntervalsStepped

DECLARE
@ManagedEntityTypeRowId INT,
@MonitorRowId INT

SELECT @ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId
FROM [dbo].[vManagedEntityType] vmet WHERE vmet.ManagedEntityTypeSystemName=@ManagedEntityTypeSystemName

SELECT @MonitorRowId = vm.MonitorRowId
FROM [dbo].[vMonitor] vm WHERE vm.MonitorSystemName=@MonitorSystemName

DECLARE
@StartDate datetime,
@EndDate datetime,
@StartDate2 datetime,
@EndDate2 datetime

IF @DataAgg=1
BEGIN
-- daily
SET @StartDate = dateadd(hour,DATEDIFF(hour,GETDATE(),GETUTCDATE()),CONVERT(DATETIME,CONVERT(VARCHAR(8), @pStartDate, 112)))
SET @EndDate = DATEADD(hour,DATEDIFF(hour,GETDATE(),GETUTCDATE()),CONVERT(DATETIME,CONVERT(VARCHAR(8), @pEndDate, 112)))
SET @StartDate2 = dateadd(hour,DATEDIFF(hour,GETDATE(),GETUTCDATE()),CONVERT(DATETIME,CONVERT(VARCHAR(8), @pStartDate2, 112)))
SET @EndDate2 = DATEADD(hour,DATEDIFF(hour,GETDATE(),GETUTCDATE()),CONVERT(DATETIME,CONVERT(VARCHAR(8), @pEndDate2, 112)))
END
ELSE BEGIN
-- hourly
SET @StartDate = DATEADD(hour, DATEPART(hour, @pStartDate), convert(varchar(8), @pStartDate, 112))
SET @EndDate = DATEADD(hour,DATEPART(hour, @pEndDate), CONVERT(DATETIME,CONVERT(VARCHAR(8), @pEndDate, 112)))
SET @StartDate2 = DATEADD(hour, DATEPART(hour, @pStartDate2), convert(varchar(8), @pStartDate2, 112))
SET @EndDate2 = DATEADD(hour,DATEPART(hour, @pEndDate2), CONVERT(DATETIME,CONVERT(VARCHAR(8), @pEndDate2, 112)))
SET @DataAgg=0
END

IF @StartDate&gt;GETUTCDATE() SET @StartDate=GETUTCDATE()
IF @StartDate2&gt;GETUTCDATE() SET @StartDate2=GETUTCDATE()
IF @EndDate&gt;GETUTCDATE() SET @EndDate=GETUTCDATE()
IF @EndDate2&gt;GETUTCDATE() SET @EndDate2=GETUTCDATE()

IF @StartDate2 IS NULL SET @StartDate2=@StartDate
IF @EndDate2 IS NULL SET @EndDate2=@EndDate

DECLARE @mTypeXml XML

CREATE TABLE #objlist
(
ManagedEntityRowId INT,
IntervalMap TINYINT,
DirtyInd BIT DEFAULT 1
)

CREATE TABLE #mType
(
ManagedEntityTypeRowId INT,
ParentManagedEntityTypeRowId INT
)

CREATE TABLE #meMonitor
(
RowId INT IDENTITY PRIMARY KEY,
ParentRowId INT,
[Level] INT,
ParentManagedEntityMonitorRowId INT,
ChildManagedEntityMonitorRowId INT,
ManagedEntityRowId INT,
DependencyMonitorInd BIT,
MonitorTypeName NVARCHAR(MAX),
RelationshipTypeRowId INT,
RelationshipHierarchyXml XML,
SkipInd INT DEFAULT 0,
ChildrenCount INT DEFAULT 0,
HasSkippedChildrenInd INT DEFAULT 0,
MonitorPath VARCHAR(MAX)
)

CREATE INDEX #ix__meMonitor ON #meMonitor (ChildManagedEntityMonitorRowId)

CREATE TABLE #stateRaw
(
RowId INT IDENTITY,
RowType CHAR(1), -- I - raw interval, T - total
IntervalNo BIGINT,
[DateTime] DATETIME,
[DateTimeTo] DATETIME,
ManagedEntityMonitorRowId INT,
ManagedEntityRowId INT,
MonitorRowId INT,
IntervalDurationMilliseconds BIGINT,
InYellowStateMilliseconds BIGINT,
InRedStateMilliseconds BIGINT,
InPlannedMaintenanceMilliseconds BIGINT,
InUnplannedMaintenanceMilliseconds BIGINT,
InDisabledStateMilliseconds BIGINT,
HealthServiceUnavailableMilliseconds BIGINT,
InWhiteStateMilliseconds BIGINT,
InGreenStateMilliseconds BIGINT,
IntervalMap TINYINT,
UptimeMilliseconds BIGINT,
UptimePct FLOAT,
DowntimeMilliseconds BIGINT,
DowntimePct FLOAT,
FEVerified BIT DEFAULT 0,
AType CHAR(1) -- S/E/M
)

CREATE TABLE #artificialIntervals
(
RowId INT,
[DateTime] DATETIME,
DateTimeTo DATETIME,
IntervalDuration BIGINT,
StepsRequired FLOAT,
AType CHAR(1),
hh INT,
NewDateTimeTo DATETIME
)

CREATE TABLE #artificialIntervalsStepped
(
RowId INT,
[DateTime] DATETIME,
DateTimeTo DATETIME
)

-- calculate unhealthy mask
DECLARE @DowntimeMask INT, @UptimeMask INT

SELECT @DowntimeMask=sum(u.n.value('.','int'))
FROM @UnhealthyStateList.nodes('/Data/Values') AS u(n)

SET @UptimeMask = 255 ^ @DowntimeMask

IF EXISTS (
SELECT TOP 1 1 FROM
[dbo].[StandardDatasetAggregationHistory] sdah
INNER JOIN [dbo].[StandardDataset] sd ON sd.DatasetId = sdah.DatasetId
WHERE
sd.SchemaName='State'
AND sdah.AggregationTypeId=20+10*@DataAgg -- 20 - hourly, 30 - daily
AND sdah.FirstAggregationStartDateTime IS NOT NULL
AND sdah.AggregationDateTime BETWEEN @StartDate AND @EndDate
)
AND
(
EXISTS (
SELECT TOP 1 1 FROM
[dbo].[StandardDatasetAggregationHistory] sdah
INNER JOIN [dbo].[StandardDataset] sd ON sd.DatasetId = sdah.DatasetId
WHERE
sd.SchemaName='State'
AND sdah.AggregationTypeId=20+10*@DataAgg -- 20 - hourly, 30 - daily
AND sdah.FirstAggregationStartDateTime IS NOT NULL
AND sdah.AggregationDateTime BETWEEN @StartDate2 AND @EndDate2
)
OR
@pStartDate2 IS NULL
)
BEGIN

-- get objects in scope
-- - interval 1
INSERT INTO #objlist
(
ManagedEntityRowId
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate,
@EndDate = @EndDate,
@ObjectList = @ObjectList,
@ForceContainment = 0

UPDATE #objlist SET IntervalMap = 1 WHERE IntervalMap IS NULL

-- - interval 2
INSERT INTO #objlist
(
ManagedEntityRowId
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate2,
@EndDate = @EndDate2,
@ObjectList = @ObjectList,
@ForceContainment = 0

UPDATE #objlist SET IntervalMap = 2 WHERE IntervalMap IS NULL

--SELECT * FROM #objlist

-- - merge intervals to remove duplicates
INSERT INTO #objlist (ManagedEntityRowId, IntervalMap, DirtyInd)
SELECT
ISNULL(o1.ManagedEntityRowId,o2.ManagedEntityRowId),
ISNULL(o1.IntervalMap,0)|ISNULL(o2.IntervalMap,0),
0
FROM
(SELECT * FROM #objlist WHERE IntervalMap=1) AS o1
FULL OUTER JOIN (SELECT * FROM #objlist WHERE IntervalMap=2) AS o2 ON o2.ManagedEntityRowId = o1.ManagedEntityRowId

DELETE FROM #objlist WHERE DirtyInd=1

-- get management type hierarchy
EXEC [dbo].[Veeam_GRL_ManagedEntityTypesGetByScope]
@ObjectList = @ObjectList, @NoOutput=1, @res=@mTypeXml OUT

INSERT #mType (ManagedEntityTypeRowId, ParentManagedEntityTypeRowId)
SELECT
ManagedEntityTypeRowId=lst.r.value('../../@ManagedEntityTypeRowId','int'),
ParentManagedEntityTypeRowId=lst.r.value('.','int')
FROM
@mTypeXml.nodes('/r/NestIdPath/Id') AS lst(r)

-- filter scope by MT using MT hierarchy
DELETE FROM #objlist
WHERE ManagedEntityRowId NOT IN (
SELECT
o.ManagedEntityRowId
FROM
#objlist o
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
INNER JOIN #mType mt ON mt.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
WHERE mt.ParentManagedEntityTypeRowId=@ManagedEntityTypeRowId
)

DECLARE @rowcount INT,
@totalrowcount INT,
@level INT,
@SkipInd BIT

SET @level=-1
SET @SkipInd=0
SET @rowcount=0
SET @totalrowcount=0

-- iterate through monitor type tree
WHILE @rowcount&gt;0 OR @level=-1
BEGIN
SET @level=@level+1

SET @SkipInd = CASE WHEN @totalrowcount&gt;=@MaxMonitorsLimit OR @NoNestedMonitors=1 THEN 1 ELSE 0 END

IF @level=0
BEGIN
INSERT INTO #meMonitor
(
[Level],
ParentManagedEntityMonitorRowId,
ChildManagedEntityMonitorRowId,
ManagedEntityRowId,
DependencyMonitorInd,
RelationshipTypeRowId,
MonitorTypeName,
SkipInd,
MonitorPath
)
SELECT DISTINCT
@level,
NULL,
vmem.ManagedEntityMonitorRowId,
vmem.ManagedEntityRowId,
vmmpv.DependencyMonitorInd,
vmmpv.RelationshipTypeRowId,
CASE WHEN vmmpv.UnitMonitorInd=1 THEN 'Unit'
WHEN vmmpv.AggregateMonitorInd=1 THEN 'Aggregate'+ISNULL(': '+vmmpv.[Algorithm],'')+ISNULL(' '+vmmpv.AlgorithmParameter,'')
WHEN vmmpv.DependencyMonitorInd=1 THEN 'Dependancy'+ISNULL(' ('+vrt.RelationshipTypeDefaultName+')','')
END,
@SkipInd,
'/'+CONVERT(VARCHAR(MAX),vmem.ManagedEntityRowId)
FROM
[dbo].[vManagedEntityMonitor] vmem
INNER JOIN [dbo].[vMonitorManagementPackVersion] vmmpv ON vmmpv.MonitorRowId = vmem.MonitorRowId
INNER JOIN #objlist o ON o.ManagedEntityRowId = vmem.ManagedEntityRowId
LEFT OUTER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeRowId = vmmpv.RelationshipTypeRowId
WHERE vmem.MonitorRowId=@MonitorRowId
END
ELSE BEGIN
-- child monitors (direct children)
INSERT INTO #meMonitor
(
ParentRowId,
[Level],
ParentManagedEntityMonitorRowId,
ChildManagedEntityMonitorRowId,
ManagedEntityRowId,
DependencyMonitorInd,
RelationshipTypeRowId,
MonitorTypeName,
SkipInd,
MonitorPath
)
SELECT DISTINCT
m_parent.RowId,
@level,
m_parent.ChildManagedEntityMonitorRowId,
vmem_child.ManagedEntityMonitorRowId,
vmem_child.ManagedEntityRowId,
mm_child.DependencyMonitorInd,
mm_child.RelationshipTypeRowId,
CASE WHEN mm_child.UnitMonitorInd=1 THEN 'Unit'
WHEN mm_child.AggregateMonitorInd=1 THEN 'Aggregate'+ISNULL(': '+mm_child.[Algorithm],'')+ISNULL(' '+mm_child.AlgorithmParameter,'')
WHEN mm_child.DependencyMonitorInd=1 THEN 'Dependancy'+ISNULL(' ('+vrt.RelationshipTypeDefaultName+')','')
END,
@SkipInd,
m_parent.MonitorPath+'/'+CONVERT(VARCHAR(MAX),vmem_child.ManagedEntityMonitorRowId)
FROM
#meMonitor m_parent
INNER JOIN [dbo].[vManagedEntityMonitor] vmem_parent ON m_parent.ChildManagedEntityMonitorRowId=vmem_parent.ManagedEntityMonitorRowId
INNER JOIN [dbo].[vMonitorManagementPackVersion] mm_child ON vmem_parent.MonitorRowId=mm_child.ParentMonitorRowId
INNER JOIN [dbo].[vManagedEntityMonitor] vmem_child ON mm_child.MonitorRowId=vmem_child.MonitorRowId AND vmem_child.ManagedEntityRowId=m_parent.ManagedEntityRowId
LEFT OUTER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeRowId = mm_child.RelationshipTypeRowId
WHERE m_parent.[Level]=@level-1;
END

-- child monitors (dependency targets - via relationship)
INSERT INTO #meMonitor
(
ParentRowId,
[Level],
ParentManagedEntityMonitorRowId,
ChildManagedEntityMonitorRowId,
ManagedEntityRowId,
DependencyMonitorInd,
RelationshipTypeRowId,
MonitorTypeName,
SkipInd,
MonitorPath
)
SELECT DISTINCT
m_parent.RowId,
@level,
m_parent.ChildManagedEntityMonitorRowId,
vmem_child.ManagedEntityMonitorRowId,
vmem_child.ManagedEntityRowId,
vmmpv_child.DependencyMonitorInd,
vmmpv_child.RelationshipTypeRowId,
CASE WHEN vmmpv_child.UnitMonitorInd=1 THEN 'Unit'
WHEN vmmpv_child.AggregateMonitorInd=1 THEN 'Aggregate'+ISNULL(': '+vmmpv_child.[Algorithm],'')+ISNULL(' '+vmmpv_child.AlgorithmParameter,'')
WHEN vmmpv_child.DependencyMonitorInd=1 THEN 'Dependancy'+ISNULL(': '+vrt.RelationshipTypeDefaultName,'')
END,
@SkipInd,
m_parent.MonitorPath+'/'+CONVERT(VARCHAR(MAX),vmem_child.ManagedEntityMonitorRowId)
FROM
#meMonitor m_parent
INNER JOIN [dbo].[vManagedEntityMonitor] vmem_parent ON m_parent.ChildManagedEntityMonitorRowId=vmem_parent.ManagedEntityMonitorRowId
INNER JOIN [dbo].[vMonitorManagementPackVersion] vmmpv_parent ON vmmpv_parent.MonitorRowId = vmem_parent.MonitorRowId
INNER JOIN [dbo].[vRelationship] vr ON vr.SourceManagedEntityRowId=m_parent.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityMonitor] vmem_child ON vr.TargetManagedEntityRowId=vmem_child.ManagedEntityRowId AND vmmpv_parent.DependencyMonitorRowId=vmem_child.MonitorRowId
INNER JOIN [dbo].[vMonitorManagementPackVersion] vmmpv_child ON vmem_child.MonitorRowId=vmmpv_child.MonitorRowId
LEFT OUTER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeRowId = vmmpv_child.RelationshipTypeRowId
WHERE
m_parent.[Level]=@level-1
AND m_parent.DependencyMonitorInd=1
AND m_parent.RelationshipHierarchyXml IS NOT NULL
AND vr.RelationshipTypeRowId IN (SELECT lst.id.value('.','int') FROM m_parent.RelationshipHierarchyXml.nodes('/Id') AS lst(id) );

-- calculate relationship hierarchies for dependancy monitors at this level
WITH cte (OriginalRelationshipTypeRowId, RelationshipTypeRowId, ParentRelationshipTypeRowId, [Level], RelationshipPath)
AS
(
SELECT mm.RelationshipTypeRowId, mm.RelationshipTypeRowId, vrtmpv.BaseRelationshipTypeRowId, 0,
CONVERT(VARCHAR(MAX),'&lt;Id&gt;'+CONVERT(VARCHAR(32),mm.RelationshipTypeRowId)+'&lt;/Id&gt;')
FROM
#meMonitor mm
INNER JOIN [dbo].[vRelationshipTypeManagementPackVersion] vrtmpv ON vrtmpv.RelationshipTypeRowId = mm.RelationshipTypeRowId
WHERE
mm.[Level]=@level
UNION ALL
SELECT
t.OriginalRelationshipTypeRowId, vrtmpv.RelationshipTypeRowId, vrtmpv.BaseRelationshipTypeRowId, t.[Level]+1,
'&lt;Id&gt;'+CONVERT(VARCHAR(32),vrtmpv.RelationshipTypeRowId)+'&lt;/Id&gt;'+t.RelationshipPath
FROM
cte t
INNER JOIN [dbo].[vRelationshipTypeManagementPackVersion] vrtmpv ON t.ParentRelationshipTypeRowId=vrtmpv.RelationshipTypeRowId
)
UPDATE mm
SET mm.RelationshipHierarchyXml = CONVERT(XML,t.RelationshipPath)
FROM
(SELECT * FROM cte WHERE ParentRelationshipTypeRowId IS NULL) t
INNER JOIN #meMonitor mm ON mm.RelationshipTypeRowId=t.OriginalRelationshipTypeRowId
WHERE mm.[Level]=@level AND mm.RelationshipTypeRowId IS NOT NULL

-- found something? let's search for children!
SELECT @rowcount=COUNT(1) FROM #meMonitor WHERE [Level]=@level
SET @totalrowcount=@totalrowcount+@rowcount
END;

-- calculate children and HasSkippedChildrenInd
UPDATE #meMonitor SET ChildrenCount = 0 WHERE [Level]=@level-1
SET @level=@level-2

WHILE @level&gt;=0
BEGIN
UPDATE mm
SET
mm.ChildrenCount = x.Cnt,
mm.HasSkippedChildrenInd=x.HasSkippedChildren
FROM
#meMonitor mm
INNER JOIN
(
SELECT
mmp.RowId,
Cnt=COUNT(1)+SUM(mmc.ChildrenCount),
mmp.[Level],
HasSkippedChildren = CASE WHEN
SUM(mmc.SkipInd)&gt;0
-- SUM(mmc.SkipInd)+SUM(mmc.HasSkippedChildrenInd)&gt;0
THEN 1 ELSE 0 END
FROM
#meMonitor mmc
INNER JOIN #meMonitor mmp ON mmp.RowId=mmc.ParentRowId
WHERE mmp.[Level]=@level
GROUP BY mmp.RowId, mmp.[Level]
) x ON mm.RowId=x.RowId

SET @level=@level-1
END

--remove monitors that should be skipped
DELETE FROM #meMonitor WHERE SkipInd=1

IF @ManagedEntityMonitorRowId IS NOT NULL
BEGIN
DELETE FROM #meMonitor WHERE ChildManagedEntityMonitorRowId&lt;&gt;@ManagedEntityMonitorRowId
END

-- get aggregated state data for selected monitors
IF @DataAgg=1 --AND @NoDetails = 0
BEGIN
-- daily w/details
INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds
)
SELECT
'I',
vsdf.[DateTime],
DATEADD(day,1,vsdf.[DateTime]),
vsdf.ManagedEntityMonitorRowId,
vmem.ManagedEntityRowId,
vmem.MonitorRowId,
60 * 1000 * 1440,
isnull(vsdf.InYellowStateMilliseconds,0),
isnull(vsdf.InRedStateMilliseconds,0),
isnull(vsdf.InPlannedMaintenanceMilliseconds,0),
isnull(vsdf.InUnplannedMaintenanceMilliseconds,0),
isnull(vsdf.InDisabledStateMilliseconds,0),
isnull(vsdf.HealthServiceUnavailableMilliseconds,0),
0,
0
FROM
[State].vStateDaily vsdf
INNER JOIN [dbo].[vManagedEntityMonitor] vmem ON vmem.ManagedEntityMonitorRowId = vsdf.ManagedEntityMonitorRowId
INNER JOIN #meMonitor mm ON mm.ChildManagedEntityMonitorRowId=vsdf.ManagedEntityMonitorRowId

WHERE
((vsdf.[DateTime] &gt;= @StartDate)
AND (vsdf.[DateTime] &lt; @EndDate))
OR
((vsdf.[DateTime] &gt;= @StartDate2)
AND (vsdf.[DateTime] &lt; @EndDate2))

END
ELSE BEGIN
-- hourly w/details
INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds
)
SELECT
'I',
vsdf.[DateTime],
DATEADD(hour,1,vsdf.[DateTime]),
vsdf.ManagedEntityMonitorRowId,
vmem.ManagedEntityRowId,
vmem.MonitorRowId,
60 * 1000 * 60,
isnull(vsdf.InYellowStateMilliseconds,0),
isnull(vsdf.InRedStateMilliseconds,0),
isnull(vsdf.InPlannedMaintenanceMilliseconds,0),
isnull(vsdf.InUnplannedMaintenanceMilliseconds,0),
isnull(vsdf.InDisabledStateMilliseconds,0),
isnull(vsdf.HealthServiceUnavailableMilliseconds,0),
0,
0
FROM
[State].vStateHourly vsdf
INNER JOIN [dbo].[vManagedEntityMonitor] vmem ON vmem.ManagedEntityMonitorRowId = vsdf.ManagedEntityMonitorRowId
INNER JOIN #meMonitor mm ON mm.ChildManagedEntityMonitorRowId=vsdf.ManagedEntityMonitorRowId
WHERE
((vsdf.[DateTime] &gt;= @StartDate)
AND (vsdf.[DateTime] &lt; @EndDate))
OR
((vsdf.[DateTime] &gt;= @StartDate2)
AND (vsdf.[DateTime] &lt; @EndDate2))
END

---- missing intervals
-- numerate intervals
UPDATE s
SET s.IntervalNo = x.IntervalNumber
FROM
(
SELECT
sr.RowId,
IntervalNumber = ROW_NUMBER() OVER (PARTITION BY sr.ManagedEntityMonitorRowId ORDER BY sr.[DateTime])
FROM
#stateRaw sr
) AS x
INNER JOIN #stateRaw s ON s.RowId=x.RowId

-- in the middle
INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds,
AType
)
SELECT
'I',
sr1.DateTimeTo,
sr2.[DateTime],
sr1.ManagedEntityMonitorRowId,
sr1.ManagedEntityRowId,
sr1.MonitorRowId,
CAST(DATEDIFF(minute,sr1.DateTimeTo,sr2.[DateTime]) AS BIGINT)*60*1000,
0,
0,
0,
0,
0,
0,
0,
0,
'M'
FROM
#stateRaw sr1
INNER JOIN #stateRaw sr2 ON sr2.ManagedEntityMonitorRowId = sr1.ManagedEntityMonitorRowId
AND sr2.IntervalNo=sr1.IntervalNo+1
WHERE DATEDIFF(minute,sr1.DateTimeTo,sr2.[DateTime])&gt;0

-- at the beginning &amp; end
DECLARE @MinStartDT DATETIME,
@MaxEndDT DATETIME,
@MaxStartDT DATETIME,
@MinEndDT DATETIME,
@tStartDT DATETIME,
@tEndDT DATETIME,
@loopCnt INT

SET @MinStartDT = CASE WHEN @StartDate&lt;@StartDate2 THEN @StartDate ELSE @StartDate2 END
SET @MaxEndDT = CASE WHEN @EndDate&gt;@EndDate2 THEN @EndDate ELSE @EndDate2 END
SET @MaxStartDT = CASE WHEN @StartDate&lt;@StartDate2 THEN @StartDate2 ELSE @StartDate END
SET @MinEndDT = CASE WHEN @EndDate&gt;@EndDate2 THEN @EndDate2 ELSE @EndDate END

SET @loopCnt=0

WHILE @loopCnt&lt;2
BEGIN

IF @loopCnt=0
BEGIN
SET @tStartDT=@MaxStartDT
SET @tEndDT=@MinEndDT
END
ELSE BEGIN
SET @tStartDT=@MinStartDT
SET @tEndDT=@MaxEndDT
END

SET @loopCnt=@loopCnt+1

-- ... beginning
INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds,
AType
)
SELECT
'I',
@tStartDT,
MIN(sr.[DateTime]),
sr.ManagedEntityMonitorRowId,
sr.ManagedEntityRowId,
sr.MonitorRowId,
CAST(DATEDIFF(minute,@tStartDT,MIN(sr.[DateTime])) AS BIGINT)*60*1000,
0,
0,
0,
0,
0,
0,
0,
0,
'S'
FROM
#stateRaw sr
GROUP BY
sr.ManagedEntityMonitorRowId,
sr.ManagedEntityRowId,
sr.MonitorRowId
HAVING
@tStartDT&lt;MIN(sr.[DateTime])

-- ...end
INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds,
AType
)
SELECT
'I',
MAX(sr.DateTimeTo),
@tEndDT,
sr.ManagedEntityMonitorRowId,
sr.ManagedEntityRowId,
sr.MonitorRowId,
CAST(DATEDIFF(minute,MAX(sr.DateTimeTo),@tEndDT) AS BIGINT)*60*1000,
0,
0,
0,
0,
0,
0,
0,
0,
'E'
FROM
#stateRaw sr
GROUP BY
sr.ManagedEntityMonitorRowId,
sr.ManagedEntityRowId,
sr.MonitorRowId
HAVING
MAX(sr.DateTimeTo)&lt;@tEndDT
END

-- some monitors may not have state data at all - lets add big artficial intervals for them!
INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds,
AType
)
SELECT DISTINCT
'I',
@MinStartDT,
@MaxEndDT,
mm.ChildManagedEntityMonitorRowId,
mm.ManagedEntityRowId,
vmem.MonitorRowId,
CAST(DATEDIFF(minute,@MinStartDT,@MaxEndDT) AS BIGINT)*60*1000,
0,
0,
0,
0,
0,
0,
0,
0,
'M'
FROM
#meMonitor mm
INNER JOIN [dbo].[vManagedEntityMonitor] vmem ON mm.ChildManagedEntityMonitorRowId=vmem.ManagedEntityMonitorRowId
WHERE
mm.ChildManagedEntityMonitorRowId NOT IN (SELECT DISTINCT sr.ManagedEntityMonitorRowId
FROM #stateRaw sr)

-- split artificial intervals into daily/hourly subintervals
-- Date &amp; Time
DECLARE @hour TABLE (hh INT)
DECLARE @date TABLE ([date] DATETIME)
DECLARE @datetime TABLE ([DateTime] DATETIME, [Date] DATETIME, [hour] INT)

INSERT INTO @hour
(
hh
)
SELECT TOP 24 (ROW_NUMBER() OVER(ORDER BY DateValue))-1
FROM [dbo].[vDate]

;WITH minmaxdt (MinDt, MaxDt)
AS
(
SELECT MIN(#stateRaw.[DateTime]), MAX(#stateRaw.DateTimeTo) FROM #stateRaw
)
INSERT INTO @date
(
date
)
SELECT
vd.DateValue
FROM
[dbo].[vDate] vd
INNER JOIN minmaxdt m ON vd.DateValue BETWEEN DATEADD(DAY,-1,m.MinDt) AND DATEADD(DAY,1,m.MaxDt)

INSERT INTO @datetime
(
[DateTime],
Date,
hour
)
SELECT
DATEADD(hour, h.hh, d.date),
d.date,
h.hh
FROM
@date d CROSS JOIN @hour h
-- / Date &amp; Time

INSERT INTO #artificialIntervals (RowId, [DateTime], DateTimeTo, IntervalDuration, StepsRequired, AType)
SELECT
sr.RowId, sr.[DateTime], sr.DateTimeTo,sr.IntervalDurationMilliseconds,
sr.IntervalDurationMilliseconds/(1000*60*60*(CASE WHEN @DataAgg=1 THEN 24 ELSE 1 END))-1,
sr.AType
FROM
#stateRaw sr
WHERE
sr.IntervalDurationMilliseconds &gt; 1000*60*60*(CASE WHEN @DataAgg=1 THEN 24 ELSE 1 END)
AND sr.IntervalNo IS NULL

UPDATE #artificialIntervals
SET hh=DATEPART(hour,CASE WHEN AType='S' THEN DateTimeTo ELSE [DateTime] END)

INSERT #artificialIntervalsStepped (RowId, [DateTime], DateTimeTo)
SELECT
ai.RowId,
vdt.[DateTime],
DateTimeTo = CASE WHEN DATEDIFF(minute,vdt.[DateTime],ai.DateTimeTo)&gt;CASE WHEN @DataAgg=1 THEN 24*60 ELSE 1*60 END
THEN DATEADD(hour,CASE WHEN @DataAgg=1 THEN 24 ELSE 1 END,vdt.[DateTime])
ELSE ai.DateTimeTo END
FROM
#artificialIntervals ai
INNER JOIN @datetime vdt ON ai.[DateTime]&lt;vdt.[DateTime] AND vdt.[DateTime]&lt;ai.DateTimeTo AND (vdt.Hour=ai.hh OR @DataAgg=0)
UPDATE x
SET x.NewDateTimeTo = y.MinDateTime
FROM
#artificialIntervals x
INNER JOIN
(
SELECT
a.RowId,
MinDateTime = MIN(a.[DateTime])
FROM
#artificialIntervalsStepped a
INNER JOIN #artificialIntervals ai ON ai.RowId = a.RowId
GROUP BY a.RowId
) y ON x.RowId=y.RowId

UPDATE sr
SET
DateTimeTo = ai.NewDateTimeTo,
IntervalDurationMilliseconds = CAST(DATEDIFF(minute,ai.[DateTime],ai.NewDateTimeTo) AS BIGINT)*60*1000
FROM
#stateRaw sr
INNER JOIN #artificialIntervals ai ON ai.RowId = sr.RowId

INSERT INTO #stateRaw
(
RowType,
[DateTime],
DateTimeTo,
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds,
AType
)
SELECT
sr.RowType,
ai.[DateTime],
ai.DateTimeTo,
sr.ManagedEntityMonitorRowId,
sr.ManagedEntityRowId,
sr.MonitorRowId,
CAST(DATEDIFF(minute,ai.[DateTime],ai.DateTimeTo) AS BIGINT)*60*1000,
0,
0,
0,
0,
0,
0,
0,
0,
sr.AType
FROM
#stateRaw sr
INNER JOIN #artificialIntervalsStepped ai ON ai.RowId = sr.RowId

-- Start/End artificial intervals shouldn't be smaller that 24h/1h depending on data aggregation mode
DELETE FROM #stateRaw
WHERE
AType IN ('S','E')
AND IntervalDurationMilliseconds&lt;((CASE WHEN @DataAgg=1 THEN 24 ELSE 1 END)*60*60*1000)

-- calculate interval maps
UPDATE sr
SET
sr.IntervalMap = CASE WHEN
((sr.[DateTime] &gt;= @StartDate)
AND (sr.[DateTime] &lt; @EndDate))
OR
((sr.[DateTimeTo] &gt; @StartDate)
AND (sr.[DateTimeTo] &lt; @EndDate))
THEN 1 ELSE 0 END |
CASE WHEN
((sr.[DateTime] &gt;= @StartDate2)
AND (sr.[DateTime] &lt; @EndDate2))
OR
((sr.[DateTimeTo] &gt; @StartDate2)
AND (sr.[DateTimeTo] &lt; @EndDate2))
THEN 2
ELSE 0 END
FROM
#stateRaw sr

-- calculate white state for all intervals - either ME or MP should be
-- unavailable = both ME and MP should be available for green state which will be calculated
-- in the next step
DECLARE @StateDSUID UNIQUEIDENTIFIER,
@MaxStateAggDT DATETIME

SELECT @StateDSUID=sd.DatasetId FROM [dbo].[StandardDataset] sd WHERE sd.SchemaName='State'

DECLARE @wState TABLE (InWhiteStateMilliseconds INT,[DateTime] DATETIME,ManagedEntityMonitorRowId INT,ManagedEntityRowId INT,MonitorRowId INT,mem_exists INT, AggregationCount INT)

IF @DataAgg=1
BEGIN
INSERT INTO @wState
(
InWhiteStateMilliseconds,
[DateTime],
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
mem_exists,
AggregationCount
)
SELECT
CASE WHEN mem_exists.ManagedEntityMonitorRowId IS NULL OR
ah.AggregationCount = 0 THEN 60 * 1000 * 1440
- ISNULL(s.InYellowStateMilliseconds, 0)
- ISNULL(s.InRedStateMilliseconds, 0)
- ISNULL(s.InDisabledStateMilliseconds, 0)
- ISNULL(s.InPlannedMaintenanceMilliseconds, 0)
- ISNULL(s.InUnplannedMaintenanceMilliseconds, 0)
- ISNULL(s.HealthServiceUnavailableMilliseconds, 0) ELSE 0 END,

dt.[DateTime] ,
ManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId ,
ManagedEntityRowId = mem.ManagedEntityRowId ,
MonitorRowId = mem.MonitorRowId ,
mem_exists.ManagedEntityMonitorRowId,
ah.AggregationCount
FROM dbo.vDateTime dt
CROSS JOIN dbo.vManagedEntityMonitor mem
INNER JOIN #meMonitor AS vm ON vm.ChildManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId
INNER JOIN #objlist AS o ON o.ManagedEntityRowId = mem.ManagedEntityRowId
LEFT OUTER JOIN [State].[vStateDaily] s ON ((s.[DateTime] &gt;= dt.[DateTime]) AND (s.[DateTime] &lt; DATEADD(day, 1, dt.[DateTime])) AND (s.ManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId))
LEFT OUTER JOIN (
SELECT DISTINCT
mem2.ManagedEntityMonitorRowId,
dt2.[Date],
dt2.[Time]
FROM dbo.vDateTime dt2
CROSS JOIN dbo.vManagedEntityMonitor mem2
INNER JOIN #meMonitor AS vm2 ON vm2.ChildManagedEntityMonitorRowId = mem2.ManagedEntityMonitorRowId
INNER JOIN dbo.vManagedEntity me ON (me.ManagedEntityRowId = mem2.ManagedEntityRowId)
INNER JOIN dbo.vMonitorManagementPackVersion mmpv ON (mmpv.MonitorRowId = mem2.MonitorRowId)
INNER JOIN dbo.vManagementGroupManagementPackVersion mgmpv ON ((mgmpv.ManagementPackVersionRowId = mmpv.ManagementPackVersionRowId) AND
(mgmpv.ManagementGroupRowId = me.ManagementGroupRowId) AND
(dt2.[DateTime] &gt;= mgmpv.InstalledDateTime) AND
(dt2.[DateTime] &lt; ISNULL(mgmpv.DeletedDateTime, '99991231')))
INNER JOIN dbo.vManagedEntityManagementGroup memg ON ((mem2.ManagedEntityRowId = memg.ManagedEntityRowId)
AND (dt2.[DateTime] &gt;= memg.FromDateTime)
AND (dt2.[DateTime] &lt; ISNULL(memg.ToDateTime, '99991231')))
WHERE (dt2.Minute = ABS(DATEDIFF(minute, GETUTCDATE(), GETDATE()) % 60))
and DATEADD(minute, DATEDIFF(minute, GETUTCDATE(), GETDATE()), dt2.[DateTime]) = CONVERT(datetime, CONVERT(char(8), DATEADD(minute, DATEDIFF(minute, GETUTCDATE(), GETDATE()), dt2.[DateTime]), 112), 112)
AND dt2.[DateTime] BETWEEN DATEADD(day,-1,CASE WHEN @pStartDate&gt;ISNULL(@pStartDate2,@pStartDate) THEN ISNULL(@pStartDate2,@pStartDate) ELSE @pStartDate END )
AND DATEADD(day,1,CASE WHEN @pEndDate&gt;ISNULL(@pEndDate2,@pEndDate) THEN @pEndDate ELSE ISNULL(@pEndDate2,@pEndDate) END)
) AS mem_exists ON (mem_exists.ManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId) AND (mem_exists.[Date] = dt.[Date]) AND (mem_exists.[Time] = dt.[Time])
LEFT JOIN dbo.StandardDatasetAggregationHistory (NOLOCK) ah ON ( ah.AggregationDateTime &gt;= dt.[DateTime] AND ah.AggregationDateTime &lt; DATEADD(day, 1, dt.[DateTime]) AND
-- (ah.AggregationDateTime = dt.[DateTime]) AND
(ah.DatasetId = @StateDSUID) AND
(ah.AggregationTypeId = 30))
WHERE (dt.Minute = ABS(DATEDIFF(minute, GETUTCDATE(), GETDATE()) % 60))
AND DATEADD(minute, DATEDIFF(minute, GETUTCDATE(), GETDATE()), dt.[DateTime]) =
CONVERT(datetime, CONVERT(char(8), DATEADD(minute, DATEDIFF(minute, GETUTCDATE(), GETDATE()), dt.[DateTime]), 112), 112)
AND dt.[DateTime] BETWEEN DATEADD(day,-1,CASE WHEN @pStartDate&gt;ISNULL(@pStartDate2,@pStartDate) THEN ISNULL(@pStartDate2,@pStartDate) ELSE @pStartDate END )
AND DATEADD(day,1,CASE WHEN @pEndDate&gt;ISNULL(@pEndDate2,@pEndDate) THEN @pEndDate ELSE ISNULL(@pEndDate2,@pEndDate) END)

END
ELSE
BEGIN

INSERT INTO @wState
(
InWhiteStateMilliseconds,
[DateTime],
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId ,
mem_exists,
AggregationCount
)
SELECT
CASE WHEN mem_exists.ManagedEntityMonitorRowId IS NULL OR
ah.AggregationCount = 0 THEN 60 * 1000 * 60
- ISNULL(s.InYellowStateMilliseconds, 0)
- ISNULL(s.InRedStateMilliseconds, 0)
- ISNULL(s.InDisabledStateMilliseconds, 0)
- ISNULL(s.InPlannedMaintenanceMilliseconds, 0)
- ISNULL(s.InUnplannedMaintenanceMilliseconds, 0)
- ISNULL(s.HealthServiceUnavailableMilliseconds, 0) ELSE 0 END,

dt.[DateTime] ,
ManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId ,
ManagedEntityRowId = mem.ManagedEntityRowId ,
MonitorRowId = mem.MonitorRowId,
mem_exists.ManagedEntityMonitorRowId,
ah.AggregationCount
FROM dbo.vDateTime dt
CROSS JOIN dbo.vManagedEntityMonitor mem
INNER JOIN #meMonitor AS vm ON vm.ChildManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId
INNER JOIN #objlist AS o ON o.ManagedEntityRowId = mem.ManagedEntityRowId
LEFT OUTER JOIN [State].vStateHourly AS s ON ((s.[DateTime] = dt.[DateTime]) AND (s.ManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId))
LEFT OUTER JOIN (
SELECT DISTINCT
mem2.ManagedEntityMonitorRowId,
dt2.[Date],
dt2.[Time]
FROM dbo.vDateTime dt2
CROSS JOIN dbo.vManagedEntityMonitor mem2
INNER JOIN #meMonitor AS vm2 ON vm2.ChildManagedEntityMonitorRowId = mem2.ManagedEntityMonitorRowId
INNER JOIN dbo.vManagedEntity me ON (me.ManagedEntityRowId = mem2.ManagedEntityRowId)
INNER JOIN dbo.vMonitorManagementPackVersion mmpv ON (mmpv.MonitorRowId = mem2.MonitorRowId)
INNER JOIN dbo.vManagementGroupManagementPackVersion mgmpv ON ((mgmpv.ManagementPackVersionRowId = mmpv.ManagementPackVersionRowId) AND
(mgmpv.ManagementGroupRowId = me.ManagementGroupRowId) AND
(dt2.[DateTime] &gt;=mgmpv.InstalledDateTime) AND
(dt2.DateTime&lt;ISNULL(mgmpv.DeletedDateTime, '99991231') ))
INNER JOIN dbo.vManagedEntityManagementGroup memg ON ((mem2.ManagedEntityRowId = memg.ManagedEntityRowId)
AND (dt2.[DateTime] &gt;= memg.FromDateTime) AND (dt2.[DateTime] &lt; ISNULL(memg.ToDateTime, '99991231')))
WHERE (dt2.Minute = 0)
AND dt2.[DateTime] BETWEEN DATEADD(hour,-1,CASE WHEN @pStartDate&gt;ISNULL(@pStartDate2,@pStartDate) THEN ISNULL(@pStartDate2,@pStartDate) ELSE @pStartDate END )
AND DATEADD(hour,1,CASE WHEN @pEndDate&gt;ISNULL(@pEndDate2,@pEndDate) THEN @pEndDate ELSE ISNULL(@pEndDate2,@pEndDate) END)
) AS mem_exists ON (mem_exists.ManagedEntityMonitorRowId = mem.ManagedEntityMonitorRowId) AND (mem_exists.[Date] = dt.[Date]) AND (mem_exists.[Time] = dt.[Time])
LEFT OUTER JOIN dbo.StandardDatasetAggregationHistory (NOLOCK) ah ON ((ah.AggregationDateTime = dt.[DateTime]) AND
(ah.DatasetId = @StateDSUID) AND
(ah.AggregationTypeId = 20))
WHERE (dt.Minute = 0)
AND dt.[DateTime] BETWEEN DATEADD(hour,-1,CASE WHEN @pStartDate&gt;ISNULL(@pStartDate2,@pStartDate) THEN ISNULL(@pStartDate2,@pStartDate) ELSE @pStartDate END )
AND DATEADD(hour,1,CASE WHEN @pEndDate&gt;ISNULL(@pEndDate2,@pEndDate) THEN @pEndDate ELSE ISNULL(@pEndDate2,@pEndDate) END)

END
UPDATE sr
SET sr.InWhiteStateMilliseconds= CASE WHEN sr.IntervalDurationMilliseconds &gt;= ws.InWhiteStateMilliseconds THEN ws.InWhiteStateMilliseconds ELSE sr.IntervalDurationMilliseconds END,
sr.FEVerified = 1
FROM #stateRaw sr
INNER JOIN @wState AS ws ON ws.[DateTime] = sr.[DateTime] AND ws.ManagedEntityMonitorRowId = sr.ManagedEntityMonitorRowId AND ws.ManagedEntityRowId = sr.ManagedEntityRowId

-- Calculate Green State
UPDATE #stateRaw
SET InGreenStateMilliseconds = IntervalDurationMilliseconds
- InYellowStateMilliseconds
- InRedStateMilliseconds
- InPlannedMaintenanceMilliseconds
- InUnplannedMaintenanceMilliseconds
- InDisabledStateMilliseconds
- HealthServiceUnavailableMilliseconds
- InWhiteStateMilliseconds


---- Calculate uptime/downtime timeline
-- absolute values
UPDATE sr
SET
UptimeMilliseconds =
sr.InRedStateMilliseconds * (1 &amp; @UptimeMask)/1 +
sr.InYellowStateMilliseconds * (2 &amp; @UptimeMask)/2 +
sr.InGreenStateMilliseconds * (4 &amp; @UptimeMask)/4 +
sr.InWhiteStateMilliseconds * (8 &amp; @UptimeMask)/8 +
sr.InDisabledStateMilliseconds * (16 &amp; @UptimeMask)/16 +
sr.HealthServiceUnavailableMilliseconds * (32 &amp; @UptimeMask)/32 +
sr.InUnplannedMaintenanceMilliseconds * (64 &amp; @UptimeMask)/64 +
sr.InPlannedMaintenanceMilliseconds * (128 &amp; @UptimeMask)/128,
sr.DowntimeMilliseconds =
sr.InRedStateMilliseconds * (1 &amp; @DowntimeMask)/1 +
sr.InYellowStateMilliseconds * (2 &amp; @DowntimeMask)/2 +
sr.InGreenStateMilliseconds * (4 &amp; @DowntimeMask)/4 +
sr.InWhiteStateMilliseconds * (8 &amp; @DowntimeMask)/8 +
sr.InDisabledStateMilliseconds * (16 &amp; @DowntimeMask)/16 +
sr.HealthServiceUnavailableMilliseconds * (32 &amp; @DowntimeMask)/32 +
sr.InUnplannedMaintenanceMilliseconds * (64 &amp; @DowntimeMask)/64 +
sr.InPlannedMaintenanceMilliseconds * (128 &amp; @DowntimeMask)/128
FROM #stateRaw sr

-- relative values
UPDATE sr
SET
sr.UptimePct = CAST(sr.UptimeMilliseconds AS FLOAT)*100/sr.IntervalDurationMilliseconds,
sr.DowntimePct = 100-CAST(sr.UptimeMilliseconds AS FLOAT)*100/sr.IntervalDurationMilliseconds
FROM #stateRaw sr

---- Calculate uptime/downtime per-monitor totals
INSERT INTO #stateRaw
(
RowType,
[DateTime],
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
IntervalDurationMilliseconds,
InYellowStateMilliseconds,
InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds,
InGreenStateMilliseconds,
IntervalMap,
UptimeMilliseconds,
UptimePct,
DowntimeMilliseconds,
DowntimePct
)
-- 1st interval
SELECT
'T',
MIN([DateTime]),
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
SUM(IntervalDurationMilliseconds),
SUM(InYellowStateMilliseconds),
SUM(InRedStateMilliseconds),
SUM(InPlannedMaintenanceMilliseconds),
SUM(InUnplannedMaintenanceMilliseconds),
SUM(InDisabledStateMilliseconds),
SUM(HealthServiceUnavailableMilliseconds),
SUM(InWhiteStateMilliseconds),
SUM(InGreenStateMilliseconds),
1,
SUM(UptimeMilliseconds),
CAST(SUM(UptimeMilliseconds) AS FLOAT)*100/SUM(IntervalDurationMilliseconds),
SUM(DowntimeMilliseconds),
100-CAST(SUM(UptimeMilliseconds) AS FLOAT)*100/SUM(IntervalDurationMilliseconds)
FROM
#stateRaw sr
WHERE
sr.IntervalMap&amp;1=1
GROUP BY
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId

UNION ALL

-- 2nd interval
SELECT
'T',
MIN([DateTime]),
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId,
SUM(IntervalDurationMilliseconds),
SUM(InYellowStateMilliseconds),
SUM(InRedStateMilliseconds),
SUM(InPlannedMaintenanceMilliseconds),
SUM(InUnplannedMaintenanceMilliseconds),
SUM(InDisabledStateMilliseconds),
SUM(HealthServiceUnavailableMilliseconds),
SUM(InWhiteStateMilliseconds),
SUM(InGreenStateMilliseconds),
2,
SUM(UptimeMilliseconds),
CAST(SUM(UptimeMilliseconds) AS FLOAT)*100/SUM(IntervalDurationMilliseconds),
SUM(DowntimeMilliseconds),
100-CAST(SUM(UptimeMilliseconds) AS FLOAT)*100/SUM(IntervalDurationMilliseconds)
FROM
#stateRaw sr
WHERE
sr.IntervalMap&amp;2=2
GROUP BY
ManagedEntityMonitorRowId,
ManagedEntityRowId,
MonitorRowId

END

---- final recordset
IF @XmlOutputOnly = 1
BEGIN
SET @OutputXml =
(
SELECT
RowId, IntervalNo, [DateTime], DateTimeTo,
ManagedEntityMonitorRowId, ManagedEntityRowId, MonitorRowId,
IntervalDurationMilliseconds, InYellowStateMilliseconds,
InRedStateMilliseconds, InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds, InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds, InWhiteStateMilliseconds,
InGreenStateMilliseconds, IntervalMap, UptimeMilliseconds,
UptimePct, DowntimeMilliseconds, DowntimePct
FROM
#stateRaw
WHERE RowType='T'
FOR XML RAW('StateDetail'), ROOT('StateDetails')
)
END
ELSE BEGIN

-- totals - both intervals side by side
SELECT
RowType = 'T',
mm.RowId,
mm.ParentRowId,
IntervalMap = NULL,
t.ManagedEntityMonitorRowId,

mm.ParentManagedEntityMonitorRowId,
mm.[Level],
mm.ChildrenCount,
mm.HasSkippedChildrenInd,

mm.MonitorTypeName,
vm.MonitorDefaultName,
vm.MonitorSystemName,
vmet.ManagedEntityTypeRowId,
vmet.ManagedEntityTypeSystemName,
vmet.ManagedEntityTypeDefaultName,
vmeti.[Image],
vme.[Path],
vme.DisplayName,

t.ManagedEntityRowId,
t.MonitorRowId,
t.DateTime1,
t.IntervalDurationMilliseconds1,
t.InYellowStateMilliseconds1,
t.InRedStateMilliseconds1,
t.InPlannedMaintenanceMilliseconds1,
t.InUnplannedMaintenanceMilliseconds1,
t.InDisabledStateMilliseconds1,
t.HealthServiceUnavailableMilliseconds1,
t.InWhiteStateMilliseconds1,
t.InGreenStateMilliseconds1,
t.UptimeMilliseconds1,
t.UptimePct1,
t.DowntimeMilliseconds1,
t.DowntimePct1,
t.DateTime2,
t.IntervalDurationMilliseconds2,
t.InYellowStateMilliseconds2,
t.InRedStateMilliseconds2,
t.InPlannedMaintenanceMilliseconds2,
t.InUnplannedMaintenanceMilliseconds2,
t.InDisabledStateMilliseconds2,
t.HealthServiceUnavailableMilliseconds2,
t.InWhiteStateMilliseconds2,
t.InGreenStateMilliseconds2,
t.UptimeMilliseconds2,
t.UptimePct2,
t.DowntimeMilliseconds2,
t.DowntimePct2
FROM
(
SELECT
ManagedEntityMonitorRowId=ISNULL(sr1.ManagedEntityMonitorRowId,sr2.ManagedEntityMonitorRowId),
ManagedEntityRowId=ISNULL(sr1.ManagedEntityRowId,sr2.ManagedEntityRowId),
MonitorRowId=ISNULL(sr1.MonitorRowId,sr2.MonitorRowId),
[DateTime1] = sr1.[DateTime],
IntervalDurationMilliseconds1 = sr1.IntervalDurationMilliseconds,
InYellowStateMilliseconds1 = sr1.InYellowStateMilliseconds,
InRedStateMilliseconds1 = sr1.InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds1 = sr1.InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds1 = sr1.InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds1 = sr1.InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds1 = sr1.HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds1 = sr1.InWhiteStateMilliseconds,
InGreenStateMilliseconds1 = sr1.InGreenStateMilliseconds,
UptimeMilliseconds1 = sr1.UptimeMilliseconds,
UptimePct1 = sr1.UptimePct,
DowntimeMilliseconds1 = sr1.DowntimeMilliseconds,
DowntimePct1 = sr1.DowntimePct,

[DateTime2] = sr2.[DateTime],
IntervalDurationMilliseconds2 = sr2.IntervalDurationMilliseconds,
InYellowStateMilliseconds2 = sr2.InYellowStateMilliseconds,
InRedStateMilliseconds2 = sr2.InRedStateMilliseconds,
InPlannedMaintenanceMilliseconds2 = sr2.InPlannedMaintenanceMilliseconds,
InUnplannedMaintenanceMilliseconds2 = sr2.InUnplannedMaintenanceMilliseconds,
InDisabledStateMilliseconds2 = sr2.InDisabledStateMilliseconds,
HealthServiceUnavailableMilliseconds2 = sr2.HealthServiceUnavailableMilliseconds,
InWhiteStateMilliseconds2 = sr2.InWhiteStateMilliseconds,
InGreenStateMilliseconds2 = sr2.InGreenStateMilliseconds,
UptimeMilliseconds2 = sr2.UptimeMilliseconds,
UptimePct2 = sr2.UptimePct,
DowntimeMilliseconds2 = sr2.DowntimeMilliseconds,
DowntimePct2 = sr2.DowntimePct
FROM
(SELECT * FROM #stateRaw WHERE IntervalMap=1 AND RowType='T') sr1
FULL OUTER JOIN (SELECT * FROM #stateRaw WHERE IntervalMap=2 AND RowType='T') sr2 ON
sr1.ManagedEntityMonitorRowId=sr2.ManagedEntityMonitorRowId
) t
INNER JOIN #meMonitor mm ON mm.ChildManagedEntityMonitorRowId=t.ManagedEntityMonitorRowId
INNER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId = t.MonitorRowId
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = t.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] vmeti ON vmeti.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId AND vmeti.ImageCategory = N'u16x16Icon'

UNION ALL

-- details - only fields for 1st intervals are used, IntervalMap should be used to search for appropriate intervals
SELECT
t.RowType,
mm.RowId,
mm.ParentRowId,
t.IntervalMap,
t.ManagedEntityMonitorRowId,

mm.ParentManagedEntityMonitorRowId,
mm.[Level],
NULL,
NULL,

NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,

t.ManagedEntityRowId,
t.MonitorRowId,
t.DateTime,
t.IntervalDurationMilliseconds,
t.InYellowStateMilliseconds,
t.InRedStateMilliseconds,
t.InPlannedMaintenanceMilliseconds,
t.InUnplannedMaintenanceMilliseconds,
t.InDisabledStateMilliseconds,
t.HealthServiceUnavailableMilliseconds,
t.InWhiteStateMilliseconds,
t.InGreenStateMilliseconds,
t.UptimeMilliseconds,
t.UptimePct,
t.DowntimeMilliseconds,
t.DowntimePct,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
FROM
#stateRaw t
INNER JOIN #meMonitor mm ON mm.ManagedEntityRowId = t.ManagedEntityRowId
WHERE RowType='I' AND @NoDetails=0

END

IF OBJECT_ID('tempdb..#objlist') IS NOT NULL DROP TABLE #objlist
IF OBJECT_ID('tempdb..#mType') IS NOT NULL DROP TABLE #mType
IF OBJECT_ID('tempdb..#meMonitor') IS NOT NULL DROP TABLE #meMonitor
IF OBJECT_ID('tempdb..#stateRaw') IS NOT NULL DROP TABLE #stateRaw
IF OBJECT_ID('tempdb..#artificialIntervals') IS NOT NULL DROP TABLE #artificialIntervals
IF OBJECT_ID('tempdb..#artificialIntervalsStepped') IS NOT NULL DROP TABLE #artificialIntervalsStepped

END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#objlist') IS NOT NULL DROP TABLE #objlist
IF OBJECT_ID('tempdb..#mType') IS NOT NULL DROP TABLE #mType
IF OBJECT_ID('tempdb..#meMonitor') IS NOT NULL DROP TABLE #meMonitor
IF OBJECT_ID('tempdb..#stateRaw') IS NOT NULL DROP TABLE #stateRaw
IF OBJECT_ID('tempdb..#artificialIntervals') IS NOT NULL DROP TABLE #artificialIntervals
IF OBJECT_ID('tempdb..#artificialIntervalsStepped') IS NOT NULL DROP TABLE #artificialIntervalsStepped

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_StateGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_StateDetailsGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_StateDetailsGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_StateDetailsGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_StateDetailsGet]
@pStartDate datetime,
@pEndDate DATETIME,
@pUnhealthyStateList XML,
@pDataAgg TINYINT,
@pManagedEntityMonitorRowId INT
AS
BEGIN
DECLARE @ObjectList NVARCHAR(MAX),
@ManagedEntityTypeSystemName NVARCHAR(512),
@MonitorSystemName NVARCHAR(512)

SELECT
@ObjectList=N'&lt;Data&gt;&lt;Objects&gt;&lt;Object Use="Self"&gt;'+CONVERT(NVARCHAR(MAX),vme.ManagedEntityRowId)+'&lt;/Object&gt;&lt;/Objects&gt;&lt;/Data&gt;',
@ManagedEntityTypeSystemName = vmet.ManagedEntityTypeSystemName,
@MonitorSystemName = vm.MonitorSystemName
FROM
[dbo].[vManagedEntity] vme
INNER JOIN [dbo].[vManagedEntityMonitor] vmem ON vmem.ManagedEntityRowId = vme.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
INNER JOIN [dbo].[vMonitor] vm ON vm.MonitorRowId = vmem.MonitorRowId
WHERE vmem.ManagedEntityMonitorRowId=@pManagedEntityMonitorRowId

EXEC [dbo].[Veeam_GRL_StateGet]
@pStartDate = @pStartDate,
@pEndDate = @pEndDate,
@pStartDate2 = null,
@pEndDate2 = null,
@ObjectList = @ObjectList,
@ManagedEntityTypeSystemName = @ManagedEntityTypeSystemName,
@MonitorSystemName = @MonitorSystemName,
@DataAgg = @pDataAgg,
@UnhealthyStateList = @pUnhealthyStateList,
@NoDetails = 0,
@ManagedEntityMonitorRowId = @pManagedEntityMonitorRowId

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_StateDetailsGet] TO OpsMgrReader
GO-- ##### Veeam_GRL_RelationTypesGetByScope_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_RelationTypesGetByScope')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_RelationTypesGetByScope] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_RelationTypesGetByScope]
@ObjectList XML
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY

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

CREATE TABLE #obj
(
ManagedEntityRowId INT
)

CREATE TABLE #reltype
(
RelationshipTypeSystemName NVARCHAR(MAX),
DisplayName NVARCHAR(MAX)
)

INSERT INTO #obj (ManagedEntityRowId)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = null,
@EndDate = null,
@ObjectList = @ObjectList,
@ForceContainment = 1,
@ManagedEntityTypeRowId = null,
@MaxLevel = null,
@XPathType = NULL

INSERT INTO #reltype
(
RelationshipTypeSystemName,
DisplayName
)
SELECT DISTINCT
vrt.RelationshipTypeSystemName,
DisplayName = vrt.RelationshipTypeDefaultName+' ('+ts.ManagedEntityTypeDefaultName+' &gt; '+tt.ManagedEntityTypeDefaultName+')'
FROM
#obj o
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.ManagedEntityRowId
INNER JOIN [dbo].[vRelationship] vr ON o.ManagedEntityRowId=vr.SourceManagedEntityRowId OR o.ManagedEntityRowId=vr.TargetManagedEntityRowId
-- INNER JOIN [dbo].[vRelationshipTypeManagementPackVersion] vrtmpv ON vme.ManagedEntityTypeRowId=vrtmpv.SourceManagedEntityTypeRowId OR vme.ManagedEntityTypeRowId=vrtmpv.TargetManagedEntityTypeRowId
-- INNER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeRowId = vrtmpv.RelationshipTypeRowId
INNER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeRowId = vr.RelationshipTypeRowId
INNER JOIN [dbo].[vRelationshipTypeManagementPackVersion] vrtmpv ON vrt.RelationshipTypeRowId=vrtmpv.RelationshipTypeRowId
INNER JOIN [dbo].[vManagedEntityType] ts ON vrtmpv.SourceManagedEntityTypeRowId=ts.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagedEntityType] tt ON vrtmpv.TargetManagedEntityTypeRowId=tt.ManagedEntityTypeRowId

IF NOT EXISTS (SELECT TOP 1 1 FROM #reltype)
BEGIN
INSERT INTO #reltype
(
RelationshipTypeSystemName,
DisplayName
)
VALUES
(
'n/a',
'Relationship types not available for selected scope'
)
END

SELECT * FROM #reltype ORDER BY DisplayName

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_RelationTypesGetByScope] TO OpsMgrReader
GO-- ##### Veeam_GRL_RelationTypePartiesGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_RelationTypePartiesGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_RelationTypePartiesGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_RelationTypePartiesGet]
@ReportSystemName NVARCHAR(MAX),
@IncludeBothOption TINYINT=0
AS
BEGIN
DECLARE @OptionsXml XML

SELECT @OptionsXml=vgr.Options
FROM [dbo].[Veeam_GRL_Report] vgr
WHERE vgr.ReportSystemName=@ReportSystemName

SELECT Value=o.t.value('@Value','nvarchar(512)'), Label=o.t.value('@Label','nvarchar(512)')
FROM @OptionsXml.nodes('/RelationTypeParties/RelationTypeParty') AS o(t)
WHERE o.t.value('@Value','nvarchar(512)')&lt;&gt;'ST' OR @IncludeBothOption&gt;0

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_RelationTypePartiesGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_RelationHistoryGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_RelationHistoryGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_RelationHistoryGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_RelationHistoryGet]
@pStartDate DATETIME,
@pEndDate DATETIME,
@ObjectList XML = NULL,
@RelationshipTypeSystemName NVARCHAR(MAX) = NULL,
@GroupBy CHAR(1) = 'S', -- S|T
@ScopeType VARCHAR(2) = 'ST' -- S|T|ST
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
IF OBJECT_ID('tempdb..#data') IS NOT NULL DROP TABLE #data
IF OBJECT_ID('tempdb..#dates') IS NOT NULL DROP TABLE #dates
IF OBJECT_ID('tempdb..#series') IS NOT NULL DROP TABLE #series

CREATE TABLE #obj
(
ManagedEntityRowId INT
)

CREATE TABLE #data
(
RowId INT IDENTITY PRIMARY KEY,
RowType CHAR(1),
sManagedEntityRowId INT,
sManagedEntityTypeRowId INT,
sManagedEntityTypeDefaultName NVARCHAR(MAX),
sPath NVARCHAR(MAX),
sDisplayName NVARCHAR(MAX),
sImage VARBINARY(MAX),

tManagedEntityRowId INT,
tManagedEntityTypeRowId INT,
tManagedEntityTypeDefaultName NVARCHAR(MAX),
tPath NVARCHAR(MAX),
tDisplayName NVARCHAR(MAX),
tImage VARBINARY(MAX),

FromDateTime DATETIME,
ToDateTime DATETIME,

IsExistsNow BIT,

IsCreated TINYINT,
IsDropped TINYINT,

ChartValue INT,
ChartId INT,

ChangesCount INT DEFAULT 0,

)

CREATE TABLE #dates
(
RowNo INT IDENTITY,
FromDt DATETIME,
ToDt DATETIME,
MiddleDt DATETIME
)

CREATE TABLE #series
(
SeriesId INT,

sManagedEntityRowId INT,
sManagedEntityTypeRowId INT,
sManagedEntityTypeDefaultName NVARCHAR(MAX),
sPath NVARCHAR(MAX),
sDisplayName NVARCHAR(MAX),

tManagedEntityRowId INT,
tManagedEntityTypeRowId INT,
tManagedEntityTypeDefaultName NVARCHAR(MAX),
tPath NVARCHAR(MAX),
tDisplayName NVARCHAR(MAX),
)

INSERT INTO #obj (ManagedEntityRowId)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = null,
@EndDate = null,
@ObjectList = @ObjectList,
@ForceContainment = 1,
@ManagedEntityTypeRowId = null,
@MaxLevel = null,
@XPathType = NULL


INSERT #data
(
RowType, sManagedEntityRowId, sManagedEntityTypeRowId,
sManagedEntityTypeDefaultName, sPath, sDisplayName, sImage,
tManagedEntityRowId, tManagedEntityTypeRowId,
tManagedEntityTypeDefaultName, tPath, tDisplayName, tImage,
FromDateTime, ToDateTime, IsCreated, IsDropped, IsExistsNow
)
SELECT DISTINCT
'D',
sManagedEntityRowId = mes.ManagedEntityRowId,
sManagedEntityTypeRowId = ts.ManagedEntityTypeRowId,
sManagedEntityTypeDefaultName = ts.ManagedEntityTypeDefaultName,
sPath = mes.[Path],
sDisplayName = mes.DisplayName,
sImage = ims.[Image],

tManagedEntityRowId = met.ManagedEntityRowId,
tManagedEntityTypeRowId = tt.ManagedEntityTypeRowId,
tManagedEntityTypeDefaultName = tt.ManagedEntityTypeDefaultName,
tPath = met.[Path],
tDisplayName = met.DisplayName,
tImage = imt.[Image],

FromDateTime=convert(datetime,convert(varchar(64),vrp.FromDateTime,100),100),
ToDateTime = convert(datetime,convert(varchar(64),isnull(vrp.ToDateTime,GETUTCDATE()),100),100),

IsCreated = CASE WHEN vrp.FromDateTime BETWEEN @pStartDate AND @pEndDate THEN 1 ELSE 0 END,
IsDropped = CASE WHEN ISNULL(vrp.ToDateTime,'99991231') BETWEEN @pStartDate AND @pEndDate THEN 1 ELSE 0 END,

IsExistsNow = CASE WHEN vrp.ToDateTime IS NULL THEN 1 ELSE 0 END

FROM
[dbo].[vRelationship] vr
INNER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeRowId = vr.RelationshipTypeRowId
INNER JOIN [dbo].[vRelationshipProperty] vrp ON vrp.RelationshipRowId = vr.RelationshipRowId
INNER JOIN #obj o ON
(o.ManagedEntityRowId=vr.SourceManagedEntityRowId AND CHARINDEX('S',@ScopeType)&gt;0)
OR
(o.ManagedEntityRowId=vr.TargetManagedEntityRowId AND CHARINDEX('T',@ScopeType)&gt;0)
INNER JOIN [dbo].[vManagedEntity] mes ON mes.ManagedEntityRowId=vr.SourceManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] ts ON mes.ManagedEntityTypeRowId=ts.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagedEntity] met ON met.ManagedEntityRowId=vr.TargetManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityType] tt ON met.ManagedEntityTypeRowId=tt.ManagedEntityTypeRowId
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] ims ON ts.ManagedEntityTypeRowId=ims.ManagedEntityTypeRowId AND ims.ImageCategory=N'u16x16Icon'
LEFT OUTER JOIN [dbo].[vManagedEntityTypeImage] imt ON tt.ManagedEntityTypeRowId=imt.ManagedEntityTypeRowId AND imt.ImageCategory=N'u16x16Icon'
WHERE
vrp.FromDateTime&lt;@pEndDate AND ISNULL(vrp.ToDateTime,'99991231')&gt;@pStartDate
AND vrt.RelationshipTypeSystemName=@RelationshipTypeSystemName

IF @GroupBy='S'
BEGIN

INSERT INTO #series
(
SeriesId,

sManagedEntityRowId,
sManagedEntityTypeRowId,
sManagedEntityTypeDefaultName,
sPath,
sDisplayName,

tManagedEntityRowId,
tManagedEntityTypeRowId,
tManagedEntityTypeDefaultName,
tPath,
tDisplayName
)
SELECT
ROW_NUMBER() OVER (PARTITION BY X.sManagedEntityRowId ORDER BY ISNULL(X.tPath,'') Asc, X.tDisplayName Asc),
X.sManagedEntityRowId, X.sManagedEntityTypeRowId,
X.sManagedEntityTypeDefaultName, X.sPath, X.sDisplayName,
X.tManagedEntityRowId, X.tManagedEntityTypeRowId,
X.tManagedEntityTypeDefaultName, X.tPath, X.tDisplayName
FROM
(SELECT DISTINCT
d.sManagedEntityRowId, d.sManagedEntityTypeRowId,
d.sManagedEntityTypeDefaultName, d.sPath, d.sDisplayName,
d.tManagedEntityRowId, d.tManagedEntityTypeRowId,
d.tManagedEntityTypeDefaultName, d.tPath, d.tDisplayName
FROM #data d) X

;WITH stat (sManagedEntityRowId, cnt)
AS
(
SELECT d.sManagedEntityRowId, COUNT(1)
FROM
#data d
GROUP BY d.sManagedEntityRowId
)
UPDATE d
SET ChangesCount = s.cnt
FROM
#data d
INNER JOIN stat s ON s.sManagedEntityRowId = d.sManagedEntityRowId

END
ELSE BEGIN
INSERT INTO #series
(
SeriesId,

sManagedEntityRowId,
sManagedEntityTypeRowId,
sManagedEntityTypeDefaultName,
sPath,
sDisplayName,

tManagedEntityRowId,
tManagedEntityTypeRowId,
tManagedEntityTypeDefaultName,
tPath,
tDisplayName
)
SELECT
ROW_NUMBER() OVER (PARTITION BY X.tManagedEntityRowId ORDER BY ISNULL(X.sPath,'') Asc, X.sDisplayName Asc),
X.sManagedEntityRowId, X.sManagedEntityTypeRowId,
X.sManagedEntityTypeDefaultName, X.sPath, X.sDisplayName,
X.tManagedEntityRowId, X.tManagedEntityTypeRowId,
X.tManagedEntityTypeDefaultName, X.tPath, X.tDisplayName
FROM
(SELECT DISTINCT
d.sManagedEntityRowId, d.sManagedEntityTypeRowId,
d.sManagedEntityTypeDefaultName, d.sPath, d.sDisplayName,
d.tManagedEntityRowId, d.tManagedEntityTypeRowId,
d.tManagedEntityTypeDefaultName, d.tPath, d.tDisplayName
FROM #data d) X

;WITH stat (tManagedEntityRowId, cnt)
AS
(
SELECT d.tManagedEntityRowId, COUNT(1)
FROM
#data d
GROUP BY d.tManagedEntityRowId
)
UPDATE d
SET ChangesCount = s.cnt
FROM
#data d
INNER JOIN stat s ON s.tManagedEntityRowId = d.tManagedEntityRowId

END

INSERT #dates (FromDt)
SELECT FromDateTime FROM #data
UNION
SELECT ToDateTime FROM #data
UNION
SELECT @pStartDate
UNION
SELECT @pEndDate

UPDATE d1
SET ToDt = d2.FromDt
FROM
#dates d1
INNER JOIN #dates d2 ON d1.RowNo=d2.RowNo-1

UPDATE #dates
SET MiddleDt = DATEADD(second,DATEDIFF(minute,FromDt,ToDt)/2,FromDt)

INSERT INTO #data
(
RowType,
sManagedEntityRowId,
sManagedEntityTypeRowId,
sManagedEntityTypeDefaultName,
sPath,
sDisplayName,
tManagedEntityRowId,
tManagedEntityTypeRowId,
tManagedEntityTypeDefaultName,
tPath,
tDisplayName,
FromDateTime,
ChartValue,
ChartId
)
SELECT
'C',
pnt.sManagedEntityRowId,
pnt.sManagedEntityTypeRowId,
pnt.sManagedEntityTypeDefaultName,
pnt.sPath,
pnt.sDisplayName,
pnt.tManagedEntityRowId,
pnt.tManagedEntityTypeRowId,
pnt.tManagedEntityTypeDefaultName,
pnt.tPath,
pnt.tDisplayName,
pnt.dt,
CASE WHEN z.RowId IS NULL THEN NULL ELSE pnt.SeriesId END,
(pnt.SeriesId-1)/10
FROM
(
SELECT
s.*,
d.dt
FROM
#series s,
(
SELECT dt = FromDt FROM #dates
UNION
SELECT dt = ToDt FROM #dates WHERE ToDt IS NOT NULL
UNION
SELECT dt = MiddleDt FROM #dates WHERE MiddleDt IS NOT NULL
) d
WHERE d.dt BETWEEN @pStartDate AND @pEndDate
) as pnt
LEFT OUTER JOIN #data z ON z.sManagedEntityRowId=pnt.sManagedEntityRowId AND z.tManagedEntityRowId=pnt.tManagedEntityRowId AND pnt.dt BETWEEN z.FromDateTime AND z.ToDateTime
ORDER BY pnt.sManagedEntityRowId, pnt.tManagedEntityRowId, pnt.dt

SELECT * FROM #data

IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj
END TRY
BEGIN CATCH
IF OBJECT_ID('tempdb..#obj') IS NOT NULL DROP TABLE #obj

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_RelationHistoryGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_ReportDetailsGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_ReportDetailsGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_ReportDetailsGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_ReportDetailsGet]
@ReportSystemName NVARCHAR(256)
AS
BEGIN
IF EXISTS(SELECT TOP 1 1 FROM [dbo].[Veeam_GRL_Report] r WHERE r.ReportSystemName=@ReportSystemName)
SELECT
ReportDefaultName = r.ReportDisplayName,
ReportDefaultDescription = CASE WHEN len(isnull(r.ReportDescription,''))&gt;0 THEN r.ReportDescription ELSE 'Description for this report is not available.' END,
MPSystemName = vmp.ManagementPackSystemName,
MPName = Replace(isnull(vmp.ManagementPackDefaultName,''),'Veeam ','')
FROM
[dbo].[Veeam_GRL_Report] r LEFT OUTER JOIN
[dbo].[vManagementPack] vmp ON r.MPSystemName=vmp.ManagementPackSystemName
WHERE r.ReportSystemName=@ReportSystemName
ELSE
SELECT
ReportDefaultName = 'Generic Report',
ReportDefaultDescription = 'Veeam generic report',
MPSystemName = vmp.ManagementPackSystemName,
MPName = Replace(vmp.ManagementPackDefaultName,'Veeam ','')
FROM
[dbo].[vManagementPack] vmp
WHERE vmp.ManagementPackSystemName='Veeam.Report.Library'
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_ReportDetailsGet] TO OpsMgrReader
GO
-- ##### Veeam_GRL_SortModesGet_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_SortModesGet')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_SortModesGet] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_SortModesGet]
@ReportSystemName NVARCHAR(MAX)
AS
BEGIN
DECLARE @OptionsXml XML

SELECT @OptionsXml=vgr.Options
FROM [dbo].[Veeam_GRL_Report] vgr
WHERE vgr.ReportSystemName=@ReportSystemName

SELECT Value=o.t.value('@Value','nvarchar(512)'), Label=o.t.value('@Label','nvarchar(512)')
FROM @OptionsXml.nodes('/SortModes/SortMode') AS o(t)

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_SortModesGet] TO OpsMgrReader
GO-- ##### Veeam_GRL_DefaultObjectListGetByReport_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_DefaultObjectListGetByReport')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_DefaultObjectListGetByReport] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_DefaultObjectListGetByReport]
@mg UNIQUEIDENTIFIER,
@ReportSystemName NVARCHAR(512)
AS
BEGIN

BEGIN TRY
DECLARE @OptionsXml XML

SELECT @OptionsXml=vgr.Options
FROM [dbo].[Veeam_GRL_Report] vgr
WHERE vgr.ReportSystemName=@ReportSystemName

SELECT
DefaultObjectList =
CAST(ISNULL((
SELECT [Objects]=
( SELECT
[Object/@Use]='Containment',
[Object]=vme.ManagedEntityRowId
FROM
[dbo].[vManagedEntityType] vmet
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagementGroup] vmg ON vmg.ManagementGroupRowId = vme.ManagementGroupRowId
INNER JOIN @OptionsXml.nodes('/Options/DefaultObjectList/ManagedEntityTypeSystemName') AS o(n) ON vmet.ManagedEntityTypeSystemName=o.n.value('.','nvarchar(max)')
WHERE
vmg.ManagementGroupGuid=@mg
FOR XML PATH(''), ELEMENTS, TYPE
)
FOR XML PATH('Data')
),'&lt;Data /&gt;') AS XML)

END TRY
BEGIN CATCH

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_DefaultObjectListGetByReport] TO OpsMgrReader
GO
-- ##### Veeam_GRL_CurrentSummaryGetByScope_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_CurrentSummaryGetByScope')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_CurrentSummaryGetByScope] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_CurrentSummaryGetByScope]
@ReportSystemName NVARCHAR(256),
@ObjectList XML,
@XmlOutputOnly BIT = 0,
@OutputXml XML = NULL OUT
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY
DECLARE @Config XML

SELECT @Config=vgr.Options
FROM [dbo].[Veeam_GRL_Report] vgr
WHERE vgr.ReportSystemName=@ReportSystemName

DECLARE
@sDt DATETIME,
@eDt DATETIME

SET @eDt=GETUTCDATE()
SET @sDt=DATEADD(hour,-5,@eDt)

IF OBJECT_ID('tempdb..#SGroup') IS NOT NULL DROP TABLE #SGroup
IF OBJECT_ID('tempdb..#SElement') IS NOT NULL DROP TABLE #SElement
IF OBJECT_ID('tempdb..#SSubElement') IS NOT NULL DROP TABLE #SSubElement
IF OBJECT_ID('tempdb..#ScopeObj') IS NOT NULL DROP TABLE #ScopeObj

CREATE TABLE #SGroup
(
GroupId INT PRIMARY KEY,
[Name] NVARCHAR(MAX),
BaseClass NVARCHAR(MAX),
ManagedEntityTypeRowId INT
)

CREATE TABLE #SElement
(
ElementId INT IDENTITY PRIMARY KEY,
GroupId INT,
[Name] NVARCHAR(MAX),
[Type] NVARCHAR(MAX),
[Source] NVARCHAR(MAX),
[Value] FLOAT,
StringValue NVARCHAR(MAX)
)

CREATE TABLE #SSubElement
(
SubElementId INT IDENTITY PRIMARY KEY,
ElementId INT,
ManagedEntityRowId INT,
[Value] FLOAT,
StringValue NVARCHAR(MAX)
)

CREATE TABLE #ScopeObj
(
ManagedEntityTypeRowId INT,
ManagedEntityRowId INT
)

-- parsing configuration
INSERT INTO #SGroup
(
GroupId,
Name,
BaseClass,
ManagedEntityTypeRowId
)
SELECT
cfg.gr.value('@ID','int'),
cfg.gr.value('@Name','nvarchar(max)'),
cfg.gr.value('@BaseClass','nvarchar(max)'),
vmet.ManagedEntityTypeRowId
FROM
@Config.nodes('/Options/ScopeSummaryConfig/Group') AS cfg(gr)
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeSystemName=cfg.gr.value('@BaseClass','nvarchar(max)')

INSERT INTO #SElement
(
GroupId,
[Name],
[Type],
[Source]
)
SELECT
cfg.gr.value('../@ID','int'),
cfg.gr.value('@Name','nvarchar(max)'),
cfg.gr.value('@Type','nvarchar(max)'),
cfg.gr.value('@Source','nvarchar(max)')
FROM
@Config.nodes('/Options/ScopeSummaryConfig/Group/Element') AS cfg(gr)
INNER JOIN #SGroup s ON s.GroupId=cfg.gr.value('../@ID','int')

-- getting objects
DECLARE
@METId INT,
@BaseClass NVARCHAR(MAX),
@Objects XML

DECLARE cur CURSOR FOR
SELECT DISTINCT s.ManagedEntityTypeRowId, s.BaseClass FROM #SGroup s

OPEN cur

FETCH cur INTO @METId, @BaseClass

WHILE @@FETCH_STATUS=0
BEGIN
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @sDt,
@EndDate = @eDt,
@ObjectList = @ObjectList,
@ManagedEntityTypeRowId = @METId,
@XmlOutputOnly = 1,
@OutputXml = @Objects OUT

IF @Objects IS NOT NULL
BEGIN
INSERT INTO #ScopeObj
(
ManagedEntityTypeRowId,
ManagedEntityRowId
)
SELECT
@METId,
O.o.value('.','int')
FROM
@Objects.nodes('/Objects/Object/ManagedEntityRowId') AS O(o)
END

SET @Objects = NULL

FETCH cur INTO @METId, @BaseClass
END

CLOSE cur
DEALLOCATE cur

-- generating sub-objects
INSERT INTO #SSubElement
(
ElementId,
ManagedEntityRowId
)
SELECT
e.ElementId,
o.ManagedEntityRowId
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #ScopeObj o ON o.ManagedEntityTypeRowId = g.ManagedEntityTypeRowId
WHERE
e.Source IS NOT NULL

---- ObjectCount
-- calculating elements
;WITH cnt
AS
(
SELECT
e.ElementId,
Cnt=COUNT(1)
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #ScopeObj o ON o.ManagedEntityTypeRowId = g.ManagedEntityTypeRowId
WHERE
e.[Type]='ObjectCount'
GROUP BY
e.ElementId
)
UPDATE e
SET [Value] = c.Cnt
FROM
#SElement e
INNER JOIN cnt c ON c.ElementId = e.ElementId

---- PropertySum
-- getting properties
;WITH pv
AS
(
SELECT
se.SubElementId,
PropertyValue = CASE WHEN ISNUMERIC(vmeps.PropertyValue)=1 THEN CONVERT(FLOAT,vmeps.PropertyValue) ELSE NULL END
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #SSubElement se ON se.ElementId = e.ElementId AND e.[Type]='PropertySum'
INNER JOIN [dbo].[vManagedEntityTypeProperty] vmetp ON vmetp.ManagedEntityTypeRowId = g.ManagedEntityTypeRowId AND vmetp.PropertySystemName=e.Source
INNER JOIN [dbo].[vManagedEntityPropertySet] vmeps ON vmeps.ManagedEntityRowId = se.ManagedEntityRowId AND vmeps.PropertyGuid = vmetp.PropertyGuid AND vmeps.ToDateTime IS NULL
)
UPDATE se
SET [Value] = pv.PropertyValue
FROM
#SSubElement se
INNER JOIN pv pv ON pv.SubElementId = se.SubElementId

---- PropertyStringValue
-- geting properties
;WITH pv
AS
(
SELECT
se.SubElementId,
PropertyValue = vmeps.PropertyValue
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #SSubElement se ON se.ElementId = e.ElementId AND e.[Type]='PropertyStringValue'
INNER JOIN [dbo].[vManagedEntityTypeProperty] vmetp ON vmetp.ManagedEntityTypeRowId = g.ManagedEntityTypeRowId AND vmetp.PropertySystemName=e.Source
INNER JOIN [dbo].[vManagedEntityPropertySet] vmeps ON vmeps.ManagedEntityRowId = se.ManagedEntityRowId AND vmeps.PropertyGuid = vmetp.PropertyGuid AND vmeps.ToDateTime IS NULL
)
UPDATE se
SET se.StringValue = pv.PropertyValue
FROM
#SSubElement se
INNER JOIN pv pv ON pv.SubElementId = se.SubElementId

---- ChildProperySum
-- geting properties
;WITH pids (SubElementId, ManagedEntityRowId, TargetManagedEntityRowId, PropertyGuid)
AS
(
SELECT
se.SubElementId,
se.ManagedEntityRowId,
vr.TargetManagedEntityRowId,
vmetp.PropertyGuid
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #SSubElement se ON se.ElementId = e.ElementId AND e.[Type]='ChildPropertySum'
INNER JOIN [dbo].[vRelationshipType] vrt ON vrt.RelationshipTypeSystemName=LEFT(e.Source,CHARINDEX('/',e.Source)-1)
INNER JOIN [dbo].[vRelationship] vr ON vr.RelationshipTypeRowId = vrt.RelationshipTypeRowId AND vr.SourceManagedEntityRowId=se.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntity] vme ON vr.TargetManagedEntityRowId=vme.ManagedEntityRowId
INNER JOIN [dbo].[vManagedEntityTypeProperty] vmetp ON vmetp.ManagedEntityTypeRowId=vme.ManagedEntityTypeRowId AND vmetp.PropertySystemName=REPLACE(e.Source,vrt.RelationshipTypeSystemName+'/','')
),
val (SubElementId, [Value])
AS
(
SELECT
p.SubElementId,
[Value]=Sum(CASE WHEN ISNUMERIC(vmeps.PropertyValue)=1 THEN CONVERT(FLOAT,vmeps.PropertyValue) ELSE NULL END)
FROM
[dbo].[vManagedEntityPropertySet] vmeps
INNER JOIN pids p ON vmeps.ManagedEntityRowId=p.TargetManagedEntityRowId AND vmeps.PropertyGuid=p.PropertyGuid AND vmeps.ToDateTime IS NULL
GROUP BY p.SubElementId
)
UPDATE se
SET
se.[Value] = v.[Value]
FROM
#SSubElement se
INNER JOIN val v ON se.SubElementId=v.SubElementId

---- PerformanceLastSum
-- geting last sample
;WITH perf
AS
(
SELECT
se.SubElementId,
Value = vpr.AverageValue,
RowNo = ROW_NUMBER() OVER ( PARTITION BY se.SubElementId ORDER BY vpr.[DateTime] DESC, vpri.PerformanceRuleInstanceRowId ASC )
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId AND e.[Type]='PerformanceLastSum'
INNER JOIN #SSubElement se ON se.ElementId = e.ElementId
INNER JOIN [dbo].[vRule] vr ON vr.RuleSystemName=e.Source
INNER JOIN [dbo].[vPerformanceRuleInstance] vpri ON vpri.RuleRowId = vr.RuleRowId
INNER JOIN Perf.vPerfHourly vpr ON vpr.PerformanceRuleInstanceRowId = vpri.PerformanceRuleInstanceRowId AND vpr.ManagedEntityRowId = se.ManagedEntityRowId
WHERE
vpr.[DateTime]&gt;=@sDt
)
UPDATE se
SET [Value] = p.[Value]
FROM
#SSubElement se
INNER JOIN perf p ON p.SubElementId = se.SubElementId AND p.RowNo=1

---- calculating totals
;WITH pvs
AS
(
SELECT
se.ElementId,
[Value] = SUM(se.[Value])
FROM
#SSubElement se
INNER JOIN #SElement s ON s.ElementId = se.ElementId
GROUP BY
se.ElementId
)
UPDATE e
SET [Value] = pvs.[Value]
FROM
#SElement e
INNER JOIN pvs ON pvs.ElementId = e.ElementId

IF @XmlOutputOnly=1
BEGIN
SET @OutputXml = (
SELECT *
FROM
(
SELECT
e.GroupId,
e.ElementId,
GroupName = g.Name,
ElementName = e.Name,

ManagedEntityRowId = NULL,
ManagedEntityName = NULL,

e.[Value],
e.StringValue
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
WHERE e.[Type]&lt;&gt;'PropertyStringValue'
UNION ALL
SELECT
e.GroupId,
e.ElementId,
GroupName = g.Name,
ElementName = e.Name,

ManagedEntityRowId = se.ManagedEntityRowId,
ManagedEntityName = vme.DisplayName,

se.[Value],
se.StringValue
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #SSubElement se ON se.ElementId = e.ElementId
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = se.ManagedEntityRowId
) X
FOR XML RAW('Element'), ROOT('Summary')
)
END
ELSE
BEGIN
SELECT
e.GroupId,
e.ElementId,
GroupName = g.Name,
ElementName = e.Name,

ManagedEntityRowId = NULL,
ManagedEntityName = NULL,

e.[Value],
e.StringValue
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
WHERE e.[Type]&lt;&gt;'PropertyStringValue'
UNION ALL
SELECT
e.GroupId,
e.ElementId,
GroupName = g.Name,
ElementName = e.Name,

ManagedEntityRowId = se.ManagedEntityRowId,
ManagedEntityName = vme.DisplayName,

se.[Value],
se.StringValue
FROM
#SGroup g
INNER JOIN #SElement e ON e.GroupId = g.GroupId
INNER JOIN #SSubElement se ON se.ElementId = e.ElementId
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = se.ManagedEntityRowId
END

END TRY
BEGIN CATCH

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_CurrentSummaryGetByScope] TO OpsMgrReader
GO-- ##### Veeam_GRL_CheckServiceAvailability_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_CheckServiceAvailability')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_CheckServiceAvailability] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_CheckServiceAvailability]
@mg UNIQUEIDENTIFIER,
@reportType NVARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON

BEGIN TRY
IF EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_CheckServiceAvailability')
BEGIN
EXEC dbo.[Veeam_CheckServiceAvailability]
@mg,
@reportType
END
END TRY
BEGIN CATCH
DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_CheckServiceAvailability] TO OpsMgrReader
GO
-- ##### Veeam_GRL_PropertiesGetByScope_CreateAlter.sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [schema_id]=SCHEMA_ID('dbo') AND type = 'P' AND name = 'Veeam_GRL_PropertiesGetByScope')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.[Veeam_GRL_PropertiesGetByScope] AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.[Veeam_GRL_PropertiesGetByScope]
@ObjectList XML,
@ReportSystemName NVARCHAR(MAX)
AS
BEGIN
BEGIN TRY
-- get options
DECLARE @OptionsXml XML

SELECT @OptionsXml=vgr.Options
FROM [dbo].[Veeam_GRL_Report] vgr
WHERE vgr.ReportSystemName=@ReportSystemName

-- get type filter
DECLARE @METFilter TABLE
(
ManagedEntityTypeRowId INT
)

INSERT @METFilter (ManagedEntityTypeRowId)
SELECT
vmet.ManagedEntityTypeRowId
FROM
@OptionsXml.nodes('/Options/ObjectListFilter/ManagedEntityTypeSystemName') o(t)
INNER JOIN [dbo].[vManagedEntityType] vmet ON vmet.ManagedEntityTypeSystemName=o.t.value('.','nvarchar(max)')

-- get all objects in scope
DECLARE @objects XML

EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = null,
@EndDate = null,
@ObjectList = @ObjectList,
@ForceContainment = 0,
@XPathType = 0,
@HostedOnly = 0,
@XmlOutputOnly = 1,
@OutputXml = @objects OUT

-- get property list
;WITH mets (ManagedEntityTypeRowId, BaseManagedEntityTypeRowId, OriginalManagedEntityTypeRowId, [Level])
AS
(
-- get all types for selected objects ...
SELECT DISTINCT
vme.ManagedEntityTypeRowId,
vmetmpv.BaseManagedEntityTypeRowId,
vme.ManagedEntityTypeRowId,
1
FROM
@objects.nodes('/Objects/Object/ManagedEntityRowId') AS o(t)
INNER JOIN [dbo].[vManagedEntity] vme ON vme.ManagedEntityRowId = o.t.value('.','int')
INNER JOIN [dbo].[vManagedEntityTypeManagementPackVersion] vmetmpv ON vmetmpv.ManagedEntityTypeRowId = vme.ManagedEntityTypeRowId
UNION ALL
-- ... and base type hierarchy
SELECT
tmpv.ManagedEntityTypeRowId,
tmpv.BaseManagedEntityTypeRowId,
m.OriginalManagedEntityTypeRowId,
m.[Level]+1
FROM
mets m
INNER JOIN [dbo].[vManagedEntityTypeManagementPackVersion] tmpv ON m.BaseManagedEntityTypeRowId=tmpv.ManagedEntityTypeRowId
)

-- get properties
SELECT DISTINCT
vmetp.PropertyGuid,
PropertyIdXml = '&lt;Property Guid="'+CAST(vmetp.PropertyGuid AS VARCHAR(max))+'" ManagedEntityTypeRowId="'+CAST(vmet.ManagedEntityTypeRowId AS NVARCHAR(max))+'" /&gt;',
vmetp.PropertyDefaultName,
vmet.ManagedEntityTypeDefaultName,
BaseManagedEntityTypeDefaultName = vmetbase.ManagedEntityTypeDefaultName,
m.OriginalManagedEntityTypeRowId,
m.[Level]
FROM
mets m
INNER JOIN [dbo].[vManagedEntityTypeProperty] vmetp ON vmetp.ManagedEntityTypeRowId=m.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagedEntityType] vmet ON m.OriginalManagedEntityTypeRowId=vmet.ManagedEntityTypeRowId
INNER JOIN [dbo].[vManagedEntityType] vmetbase ON m.ManagedEntityTypeRowId=vmetbase.ManagedEntityTypeRowId
LEFT OUTER JOIN @METFilter f ON m.OriginalManagedEntityTypeRowId=f.ManagedEntityTypeRowId
WHERE
-- apply type filter or ignore if empty
(f.ManagedEntityTypeRowId IS NOT NULL
OR NOT EXISTS (SELECT 1 FROM @METFilter))
-- no "object status" property
AND vmetp.PropertyDefaultName NOT IN ('Object Status','Notes', 'Asset Status', 'Reserved1', 'Reserved2')
ORDER BY vmet.ManagedEntityTypeDefaultName, vmetp.PropertyDefaultName

END TRY
BEGIN CATCH

DECLARE @errMsg VARCHAR(1024)
SET @errMsg = ERROR_MESSAGE()

RAISERROR(@errMsg, 16, 1)
END CATCH

END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_PropertiesGetByScope] TO OpsMgrReader
GO
--------------------------------------------------------------------------------------
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Veeam_GRL_VMSnapshotGet]') AND type in (N'P'))
BEGIN
EXECUTE ('CREATE PROCEDURE [dbo].[Veeam_GRL_VMSnapshotGet] AS RETURN 1')
END
GO


ALTER PROCEDURE [dbo].[Veeam_GRL_VMSnapshotGet]
@StartDate DATETIME,
@EndDate DATETIME,
@ObjectList XML,
@ObjectTypeSystemName NVARCHAR(MAX),
@ManagedEntityTypeSystemName NVARCHAR(MAX),
@SnapshotAgeRuleName NVARCHAR(MAX),
@SnapshotSizeRuleName NVARCHAR(MAX),
@VmNamePropertyName NVARCHAR(MAX),
@SnapshotNamePropertyName NVARCHAR(MAX),
@CreateTimePropertyName NVARCHAR(MAX),
@SnapshotSizePropertyName NVARCHAR(MAX),
@SnapshotDescriptionPropertyName NVARCHAR(MAX),
@VmId NVARCHAR(MAX)
AS
BEGIN

DECLARE
@ErrorInd bit
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)
,@ErrorMessageText nvarchar(4000)

DECLARE
@ManagedEntityTypeRowId INT,
@VMNamePropertyID INT,
@SnapshotNamePropertyID INT,
@CreatedDatePropertyID INT,
@SizePropertyID INT,
@DescriptionPropertyID INT,
@ObjectType INT,
@SnapshotAgeRule UNIQUEIDENTIFIER,
@SnapshotSizeRule UNIQUEIDENTIFIER

BEGIN TRY

--SELECT @ObjectType=votp.ObjectTypeId FROM VeeamMP.vObjectType AS votp WHERE votp.SystemName='Veeam.Virt.Extensions.VMware.VMSnapshot'
--SELECT @VMNamePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName='vmName' AND votp.ObjectTypeId=@ObjectType
--SELECT @SnapshotNamePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName='vmSnapshotName' AND votp.ObjectTypeId=@ObjectType
--SELECT @CreatedDatePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName='createTime' AND votp.ObjectTypeId=@ObjectType
--SELECT @SizePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName='size' AND votp.ObjectTypeId=@ObjectType
--SELECT @DescriptionPropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName='description' AND votp.ObjectTypeId=@ObjectType

--SELECT @ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId FROM [dbo].[vManagedEntityType] vmet WHERE vmet.ManagedEntityTypeSystemName = 'Veeam.Virt.Extensions.VMware.VMGUEST'

--SELECT @SnapshotAgeRule=vr.RuleGuid FROM [dbo].[vRule] vr WHERE vr.RuleSystemName = 'Veeam.Virt.Extensions.VMware.VMGUEST.Collect.snapshotAge'
--SELECT @SnapshotSizeRule=vr.RuleGuid FROM [dbo].[vRule] vr WHERE vr.RuleSystemName = 'Veeam.Virt.Extensions.VMware.VMGUEST.Collect.snapshotsSize'

SELECT @ObjectType=votp.ObjectTypeId FROM VeeamMP.vObjectType AS votp WHERE votp.SystemName=@ObjectTypeSystemName
SELECT @VMNamePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName=@VmNamePropertyName AND votp.ObjectTypeId=@ObjectType
SELECT @SnapshotNamePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName=@SnapshotNamePropertyName AND votp.ObjectTypeId=@ObjectType
SELECT @CreatedDatePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName=@CreateTimePropertyName AND votp.ObjectTypeId=@ObjectType
SELECT @SizePropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName=@SnapshotSizePropertyName AND votp.ObjectTypeId=@ObjectType
SELECT @DescriptionPropertyID=votp.ObjectTypePropertyId FROM VeeamMP.vObjectTypeProperty AS votp WHERE votp.SystemName=@SnapshotDescriptionPropertyName AND votp.ObjectTypeId=@ObjectType

SELECT @ManagedEntityTypeRowId = vmet.ManagedEntityTypeRowId FROM [dbo].[vManagedEntityType] vmet WHERE vmet.ManagedEntityTypeSystemName = @ManagedEntityTypeSystemName
--'Veeam.Virt.Extensions.HyperV.VMRule.SnapshotSize'
--'Veeam.Virt.Extensions.HyperV.VMRule.SnapshotAge'

SELECT @SnapshotAgeRule=vr.RuleGuid FROM [dbo].[vRule] vr WHERE vr.RuleSystemName = @SnapshotAgeRuleName
SELECT @SnapshotSizeRule=vr.RuleGuid FROM [dbo].[vRule] vr WHERE vr.RuleSystemName = @SnapshotSizeRuleName

CREATE TABLE #vmDW
(
ManagedEntityId INT,
VMName NVARCHAR(MAX)
)

CREATE TABLE #vmSnapshot
(
ManagedEntityId INT,
DWManagedEntityId INT,
VMId NVARCHAR(MAX)
)

-- build VMs list
INSERT INTO #vmDW
(
ManagedEntityId
)
EXEC [dbo].[Veeam_GRL_ObjectListGet]
@StartDate = @StartDate,
@EndDate = @EndDate,
@ObjectList = @ObjectList,
@ForceContainment = 1,
@ManagedEntityTypeRowId = @ManagedEntityTypeRowId

UPDATE vm
SET vm.VMName=vme.Name
FROM #vmDW AS vm
INNER JOIN dbo.vManagedEntity AS vme ON vm.ManagedEntityId=vme.ManagedEntityRowId

INSERT INTO #vmSnapshot
(
ManagedEntityId,
VMId,
DWManagedEntityId
)
SELECT DISTINCT
vo.ObjectId,
vopv.[Value],
vm.ManagedEntityId
FROM VeeamMP.vObject AS vo
INNER JOIN VeeamMP.vObjectType AS vot ON vot.ObjectTypeId = vo.TypeId
INNER JOIN VeeamMP.vObjectPropertyValue AS vopv ON vopv.ObjectGuid=vo.ObjectGuid
INNER JOIN #vmDW AS vm ON vopv.[Value]=vm.VMName
INNER JOIN VeeamMP.vObjectTypeProperty AS votp ON votp.ObjectTypePropertyId=vopv.ObjectTypePropertyId
WHERE vot.SystemName=@ObjectTypeSystemName AND votp.SystemName=@VmId--'VMID'

--get total perf metric
--to be deleted after fix collector
DECLARE @vmObjects XML
SET @vmObjects =
(
SELECT
(
SELECT
v.ManagedEntityRowId AS [Object]
FROM dbo.vManagedEntity AS v
FOR XML PATH('') ,TYPE
)
FOR XML PATH('Objects') , ROOT('Data'),TYPE
)
CREATE TABLE #rawdata
(
[DATETIME] DATETIME,
RuleRowId INT,
ManagedEntityRowId INT,
SampleCount INT,
AverageValue FLOAT,
SumAvgValue FLOAT,
MinValue FLOAT,
MaxValue FLOAT
)

DECLARE @PerfRequestConfig XML,
@PerfResponse XML

SET @PerfRequestConfig =
(
SELECT
[Value] = @vmObjects.query('/Data[1]/Objects[1]/Object'),
[Value/Rule] = @SnapshotSizeRule
FOR XML PATH('Values'), ROOT('Data')
)

DECLARE @perfStartdatetime DATETIME,
@perfEnddatetime DATETIME
set @perfStartdatetime = dateadd(hour,-24,GETDATE())
set @perfEnddatetime = GETDATE()

EXEC [dbo].[Veeam_GRL_PerformanceGet]
@dtStart = @perfStartdatetime,
@dtEnd = @perfEnddatetime,
@config = @PerfRequestConfig,
@DataAgg = 0,
@DataMode = 'G',
@SectionMode = 'N',
@Histogram = 0,
@enableTrendCalc = 1,
@XmlOutputOnly = 1,
@OutputXml = @PerfResponse OUT

INSERT INTO #rawdata
(
[DATETIME],
RuleRowId,
ManagedEntityRowId,
SampleCount,
AverageValue,
SumAvgValue,
MinValue,
MaxValue
)
SELECT

p.n.value('@DateTime', 'DATETIME'),
p.n.value('@RuleRowId', 'INT'),
p.n.value('@ManagedEntityRowId', 'INT'),
p.n.value('@SampleCount', 'INT'),
p.n.value('@AverageValue', 'Float'),
p.n.value('@SumAvgValue', 'Float'),
p.n.value('@MinValue', 'Float'),
p.n.value('@MaxValue', 'Float')
FROM @PerfResponse.nodes('/Performance/PerfPoints/PerfPoint[@RowType="I"]') AS p(n)


SELECT DISTINCT
VMName=vmName.[Value],
SnapshotName=snapshotName.[Value],
DataCreated= dataCreated.[Value],--CAST(dataCreated.[Value] AS DATETIME),
[SIZE]=sizeSnapshot.[Value],
[DESCRIPTION]=descriptionSnapshot.[Value],
vs.DWManagedEntityId,
SnapshotAgeRuleGuid=@SnapshotAgeRule,
SnapshotSizeRuleGuid=@SnapshotSizeRule,
isnull(r.AverageValue,-1) TotalVmSize
FROM VeeamMP.vObject AS vo
INNER JOIN #vmSnapshot AS vs ON vo.ObjectId=vs.ManagedEntityId
INNER JOIN VeeamMP.vObjectPropertyValue AS vmName ON vo.ObjectGuid=vmName.ObjectGuid AND vmName.ObjectTypePropertyId=@VMNamePropertyID
INNER JOIN VeeamMP.vObjectPropertyValue AS snapshotName ON vo.ObjectGuid=snapshotName.ObjectGuid AND snapshotName.ObjectTypePropertyId=@SnapshotNamePropertyID
INNER JOIN VeeamMP.vObjectPropertyValue AS dataCreated ON vo.ObjectGuid=dataCreated.ObjectGuid AND dataCreated.ObjectTypePropertyId=@createdDatePropertyID
INNER JOIN VeeamMP.vObjectPropertyValue AS sizeSnapshot ON vo.ObjectGuid=sizeSnapshot.ObjectGuid AND sizeSnapshot.ObjectTypePropertyId=@SizePropertyID
INNER JOIN VeeamMP.vObjectPropertyValue AS descriptionSnapshot ON vo.ObjectGuid=descriptionSnapshot.ObjectGuid AND descriptionSnapshot.ObjectTypePropertyId=@descriptionPropertyID
INNER JOIN #vmDW vd ON vd.VMName=vs.VMId
LEFT JOIN (SELECT ManagedEntityRowId,AVG(AverageValue) AverageValue FROM #rawdata GROUP BY ManagedEntityRowId) r ON vd.ManagedEntityId=r.ManagedEntityRowId
ORDER BY dataCreated.[Value] DESC
END TRY
BEGIN CATCH
if object_id('tempdb..#VMSnapshots') IS NOT NULL drop table #VMSnapshots
if object_id('tempdb..#NewVMSnapshotObj') IS NOT NULL drop table #NewVMSnapshotObj
IF (@@TRANCOUNT &gt; 0)
ROLLBACK TRAN

SELECT
@ErrorNumber = ERROR_NUMBER()
,@ErrorSeverity = ERROR_SEVERITY()
,@ErrorState = ERROR_STATE()
,@ErrorLine = ERROR_LINE()
,@ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-')
,@ErrorMessageText = ERROR_MESSAGE()

END CATCH
END
GO

GRANT EXECUTE ON dbo.[Veeam_GRL_VMSnapshotGet] TO OpsMgrReader
GO
</Upgrade>
</DataWarehouseScript>