Alert data set

Microsoft.SystemCenter.DataWarehouse.DataSet.Alert (DataWarehouseDataSet)

Defines storage and aggregation for alert information

Element properties:

AccessibilityPublic

Source Code:

<DataWarehouseDataSet ID="Microsoft.SystemCenter.DataWarehouse.DataSet.Alert" Accessibility="Public">
<Dependencies>
<DataWarehouseScript>Microsoft.SystemCenter.DataWarehouse.Script.DatasetDebuggingSupport</DataWarehouseScript>
<DataWarehouseScript>Microsoft.SystemCenter.DataWarehouse.Script.StandardDatasetSupport</DataWarehouseScript>
</Dependencies>
<Configuration>
<IncludeSchemaTypes>
<SchemaType>Microsoft.SystemCenter.DataWarehouse.StandardDatasetSchema</SchemaType>
</IncludeSchemaTypes>
<xsd:element name="Storage" type="AggregationSettingsType"/>
<xsd:element name="RawInsertTableCount" type="xsd:positiveInteger"/>
<xsd:element name="BlockingMaintenanceDailyStartTime" type="TimeOfDayType"/>
<xsd:element name="BlockingMaintenanceDurationMinutes" type="xsd:positiveInteger"/>
</Configuration>
<Install>
SET NOCOUNT ON

EXEC StandardDatasetDelete @DatasetId = '$Config/DatasetId$'
GO

INSERT StandardDataset (
DatasetId
,SchemaName
,DefaultAggregationIntervalCount
,RawInsertTableCount
,StagingProcessorStoredProcedureName
,BlockingMaintenanceDailyStartTime
,BlockingMaintenanceDurationMinutes
)
VALUES
(
'$Config/DatasetId$'
,'Alert'
,0
,$Config/RawInsertTableCount$
,'AlertProcessStaging'
,'$Config/BlockingMaintenanceDailyStartTime$'
,$Config/BlockingMaintenanceDurationMinutes$
)
GO

SET NOCOUNT ON

INSERT StandardDatasetAggregation
(
DatasetId
,AggregationTypeId
,AggregationIntervalDurationMinutes
,AggregationStartDelayMinutes
,BuildAggregationStoredProcedureName
,DeleteAggregationStoredProcedureName
,GroomStoredProcedureName
,IndexOptimizationIntervalMinutes
,MaxDataAgeDays
,GroomingIntervalMinutes
,MaxRowsToGroom
,LastGroomingDateTime
,DataFileGroupName
,IndexFileGroupName
)
VALUES (
'$Config/DatasetId$'
,0
,NULL
,NULL
,NULL
,NULL
,'AlertGroom'
,$Config/Storage/IndexOptimizationIntervalMinutes$
,$Config/Storage/MaxDataAgeDays$
,$Config/Storage/GroomingIntervalMinutes$
,$Config/Storage/MaxRowsToGroom$
,GETUTCDATE()
,ISNULL(CAST(NULLIF('$Config/Storage/DataFileGroupName$', '') AS sysname), 'default')
,ISNULL(CAST(NULLIF('$Config/Storage/IndexFileGroupName$', '') AS sysname), 'default')
)
GO

SET NOCOUNT ON

DECLARE
@MaxTableRowCount int
,@MaxTableSizeKb int

SELECT
@MaxTableSizeKb = NULLIF('$Config/Storage/MaxTableSizeKb$', '')
,@MaxTableRowCount = NULLIF('$Config/Storage/MaxTableRowCount$', '')

INSERT StandardDatasetAggregationStorage
(
DatasetId
,AggregationTypeId
,BaseTableName
,DependentTableInd
,TableTemplate
,CoverViewSelectClause
,MaxTableRowCount
,MaxTableSizeKb
)
VALUES
(
'$Config/DatasetId$'
,0
,'Alert'
,0
,'
CREATE TABLE [Alert].[Alert_$Guid$]
(
AlertRowId int NOT NULL IDENTITY(1, 1)
,AlertGuid uniqueidentifier NOT NULL
,AlertProblemGuid uniqueidentifier NOT NULL
,ManagedEntityRowId int NOT NULL
,AlertName nvarchar(256) NOT NULL
,AlertDescription nvarchar(max) NULL
,Severity tinyint NOT NULL
,Priority tinyint NOT NULL
,Category nvarchar(256) NOT NULL
,WorkflowRowId int NULL
,MonitorAlertInd bit NOT NULL
,[DateTime] datetime NOT NULL
,RaisedDateTime AS ([DateTime])
,SiteName nvarchar(256) NULL
,RepeatCount int NOT NULL
,AlertStringGuid uniqueidentifier NULL
,ParameterHash uniqueidentifier NULL
,DBCreatedDateTime datetime NOT NULL
,DWCreatedDateTime datetime NOT NULL DEFAULT(GETUTCDATE())
,DWLastModifiedDateTime datetime NOT NULL DEFAULT(GETUTCDATE())

,CONSTRAINT [PK_Alert_$Guid$] PRIMARY KEY CLUSTERED (AlertRowId) ON $DataFileGroupName$
) ON $DataFileGroupName$
'
,'SELECT
AlertGuid
,AlertProblemGuid
,AlertName
,AlertDescription
,Severity
,Priority
,Category
,ManagedEntityRowId
,WorkflowRowId
,MonitorAlertInd
,RaisedDateTime
,SiteName
,RepeatCount
,AlertStringGuid
,ParameterHash
,DBCreatedDateTime
,DWCreatedDateTime
,DWLastModifiedDateTime
'
,@MaxTableRowCount
,@MaxTableSizeKb
)

INSERT StandardDatasetAggregationStorage
(
DatasetId
,AggregationTypeId
,BaseTableName
,TableTag
,DependentTableInd
,TableTemplate
,CoverViewSelectClause
,MaxTableRowCount
,MaxTableSizeKb
)
VALUES
(
'$Config/DatasetId$'
,0
,'AlertResolutionState'
,'state'
,1
,'
CREATE TABLE [Alert].[AlertResolutionState_$Guid$]
(
AlertResolutionStateRowId int NOT NULL IDENTITY(1, 1)
,AlertGuid uniqueidentifier NOT NULL
,ResolutionState tinyint NOT NULL
,TimeInStateSeconds int NOT NULL DEFAULT (-1)
,TimeFromRaisedSeconds int NOT NULL
,StateSetDateTime datetime NOT NULL
,StateSetByUserId nvarchar(256) NULL
,DWCreatedDateTime datetime NOT NULL DEFAULT(GETUTCDATE())

,CONSTRAINT [PK_AlertResolutionState_$Guid$] PRIMARY KEY CLUSTERED (AlertResolutionStateRowId) ON $DataFileGroupName$

) ON $DataFileGroupName$
'
,'SELECT
AlertGuid
,ResolutionState
,TimeInStateSeconds
,TimeFromRaisedSeconds
,StateSetDateTime
,StateSetByUserId
,DWCreatedDateTime
'
,$Config/Storage/MaxTableRowCount$
,NULL
)

INSERT StandardDatasetAggregationStorage
(
DatasetId
,AggregationTypeId
,BaseTableName
,TableTag
,DependentTableInd
,TableTemplate
,CoverViewSelectClause
,MaxTableRowCount
,MaxTableSizeKb
)
VALUES
(
'$Config/DatasetId$'
,0
,'AlertDetail'
,'detail'
,1
,'
CREATE TABLE [Alert].[AlertDetail_$Guid$]
(
AlertDetailRowId int NOT NULL IDENTITY(1, 1)
,AlertGuid uniqueidentifier NOT NULL
,Owner nvarchar(256) NULL
,TicketId nvarchar(256) NULL
,CustomField1 nvarchar(256) NULL
,CustomField2 nvarchar(256) NULL
,CustomField3 nvarchar(256) NULL
,CustomField4 nvarchar(256) NULL
,CustomField5 nvarchar(256) NULL
,CustomField6 nvarchar(256) NULL
,CustomField7 nvarchar(256) NULL
,CustomField8 nvarchar(256) NULL
,CustomField9 nvarchar(256) NULL
,CustomField10 nvarchar(256) NULL
,DBLastModifiedDateTime datetime NOT NULL
,DBLastModifiedByUserId nvarchar(256) NULL
,DWCreatedDateTime datetime NOT NULL DEFAULT(GETUTCDATE())
,TfsWorkItemId nvarchar(256) NULL
,TfsWorkItemOwner nvarchar(256) NULL

,CONSTRAINT [PK_AlertDetail_$Guid$] PRIMARY KEY CLUSTERED (AlertDetailRowId) ON $DataFileGroupName$
) ON $DataFileGroupName$
'
,'SELECT
AlertGuid
,Owner
,TicketId
,CustomField1
,CustomField2
,CustomField3
,CustomField4
,CustomField5
,CustomField6
,CustomField7
,CustomField8
,CustomField9
,CustomField10
,DBLastModifiedDateTime
,DBLastModifiedByUserId
,DWCreatedDateTime
,TfsWorkItemId
,TfsWorkItemOwner
'
,$Config/Storage/MaxTableRowCount$
,NULL
)

INSERT StandardDatasetAggregationStorage
(
DatasetId
,AggregationTypeId
,BaseTableName
,TableTag
,DependentTableInd
,TableTemplate
,CoverViewSelectClause
,MaxTableRowCount
,MaxTableSizeKb
)
VALUES
(
'$Config/DatasetId$'
,0
,'AlertParameter'
,'parameter'
,1
,'
CREATE TABLE [Alert].[AlertParameter_$Guid$]
(
AlertParameterRowId int NOT NULL IDENTITY(1, 1)
,AlertGuid uniqueidentifier NOT NULL
,ParameterIndex tinyint NOT NULL
,ParameterValue nvarchar(max) NULL

,CONSTRAINT [PK_AlertParameter_$Guid$] PRIMARY KEY CLUSTERED (AlertParameterRowId) ON $DataFileGroupName$

) ON $DataFileGroupName$
'
,'SELECT
AlertGuid
,ParameterIndex
,ParameterValue
'
,$Config/Storage/MaxTableRowCount$
,NULL
)
GO

-- main event table indexes

EXEC StandardDatasetIndexDelete
@DatasetId = '$Config/DatasetId$'
,@IndexGuid = '6973521E-D4EC-4612-9A01-422DD56DEE12'
,@DeleteIndexOnExistingTablesInd = 0

EXEC StandardDatasetIndexInsert
@DatasetId = '$Config/DatasetId$'
,@AggregationTypeId = 0
,@DependentTableInd = 0
,@TableTag = NULL
,@UniqueInd = 0
,@IndexGuid = '6973521E-D4EC-4612-9A01-422DD56DEE12'
,@IndexDefinition = '([DateTime])'
,@CreateIndexOnExistingTablesInd = 0


EXEC StandardDatasetIndexDelete
@DatasetId = '$Config/DatasetId$'
,@IndexGuid = '8B2F5444-58E6-450b-9432-9EE85866F8DA'
,@DeleteIndexOnExistingTablesInd = 0

EXEC StandardDatasetIndexInsert
@DatasetId = '$Config/DatasetId$'
,@AggregationTypeId = 0
,@DependentTableInd = 0
,@TableTag = NULL
,@UniqueInd = 1
,@IndexGuid = '8B2F5444-58E6-450b-9432-9EE85866F8DA'
,@IndexDefinition = '(AlertGuid)'
,@CreateIndexOnExistingTablesInd = 0

-- alert resolution state indexes

EXEC StandardDatasetIndexDelete
@DatasetId = '$Config/DatasetId$'
,@IndexGuid = 'A6059CE4-1DED-41ee-B7BA-4B99DB7F734C'
,@DeleteIndexOnExistingTablesInd = 0

EXEC StandardDatasetIndexInsert
@DatasetId = '$Config/DatasetId$'
,@AggregationTypeId = 0
,@DependentTableInd = 1
,@TableTag = 'state'
,@UniqueInd = 0
,@IndexGuid = 'A6059CE4-1DED-41ee-B7BA-4B99DB7F734C'
,@IndexDefinition = '(AlertGuid)'
,@CreateIndexOnExistingTablesInd = 0

-- alert detail indexes

EXEC StandardDatasetIndexDelete
@DatasetId = '$Config/DatasetId$'
,@IndexGuid = 'D4967801-2F91-4b04-ADC3-7A64C805A16A'
,@DeleteIndexOnExistingTablesInd = 0

EXEC StandardDatasetIndexInsert
@DatasetId = '$Config/DatasetId$'
,@AggregationTypeId = 0
,@DependentTableInd = 1
,@TableTag = 'detail'
,@UniqueInd = 0
,@IndexGuid = 'D4967801-2F91-4b04-ADC3-7A64C805A16A'
,@IndexDefinition = '(AlertGuid)'
,@CreateIndexOnExistingTablesInd = 0

-- alert parameter indexes

EXEC StandardDatasetIndexDelete
@DatasetId = '$Config/DatasetId$'
,@IndexGuid = 'A953E9C0-8936-4e13-ADE2-F28285EC4B2B'
,@DeleteIndexOnExistingTablesInd = 0

EXEC StandardDatasetIndexInsert
@DatasetId = '$Config/DatasetId$'
,@AggregationTypeId = 0
,@DependentTableInd = 1
,@TableTag = 'parameter'
,@UniqueInd = 1
,@IndexGuid = 'A953E9C0-8936-4e13-ADE2-F28285EC4B2B'
,@IndexDefinition = '(AlertGuid, ParameterIndex)'
,@CreateIndexOnExistingTablesInd = 0

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE [name] = 'Alert')
BEGIN
EXECUTE('CREATE SCHEMA Alert')
END
GO

-- change schema ownership to allow index rebuild and reorganize
ALTER AUTHORIZATION ON SCHEMA::Alert TO OpsMgrWriter
GO

-- change schema alter to allow domain table index rebuild
GRANT ALTER ON SCHEMA::dbo TO OpsMgrWriter
GO

-- grant create table permissions
GRANT CREATE TABLE TO OpsMgrWriter
GO

EXEC StandardDatasetAllocateStorage @DatasetId = '$Config/DatasetId$', @AggregationTypeId = 0
GO


-- insert staging definition into StandardDatasetStagingArea
BEGIN TRAN

IF EXISTS (SELECT * FROM StandardDatasetStagingArea WHERE DatasetId = '$Config/DatasetId$')
BEGIN
DELETE StandardDatasetStagingArea
WHERE DatasetId = '$Config/DatasetId$'
END

INSERT StandardDatasetStagingArea
(
DatasetId
,StagingTableColumnDefinition
,BatchedProcessingSupportedInd
,MaxRowsToProcessPerTransactionCount
)
VALUES
(
'$Config/DatasetId$'
,'
DatasetId uniqueidentifier NOT NULL
,ManagementGroupGuid uniqueidentifier NOT NULL
,AlertGuid uniqueidentifier NOT NULL
,AlertProblemGuid uniqueidentifier NOT NULL
,ManagedEntityGuid uniqueidentifier NOT NULL
,AlertName nvarchar(256) NOT NULL
,AlertDescription nvarchar(max) NULL
,Severity tinyint NOT NULL
,Priority tinyint NOT NULL
,Category nvarchar(256) NOT NULL
,MonitorAlertInd bit NOT NULL
,WorkflowGuid uniqueidentifier NOT NULL
,RaisedDateTime datetime NOT NULL
,CreatedDateTime datetime NOT NULL
,ResolutionState tinyint NOT NULL
,Owner nvarchar(256) NULL
,TicketId nvarchar(256) NULL
,CustomField1 nvarchar(256) NULL
,CustomField2 nvarchar(256) NULL
,CustomField3 nvarchar(256) NULL
,CustomField4 nvarchar(256) NULL
,CustomField5 nvarchar(256) NULL
,CustomField6 nvarchar(256) NULL
,CustomField7 nvarchar(256) NULL
,CustomField8 nvarchar(256) NULL
,CustomField9 nvarchar(256) NULL
,CustomField10 nvarchar(256) NULL
,SiteName nvarchar(256) NULL
,AlertParams xml NULL
,ParameterHash uniqueidentifier NULL
,RepeatCount int NOT NULL
,AlertStringGuid uniqueidentifier NULL
,DBLastModifiedDateTime datetime NOT NULL
,DBLastModifiedByUserId nvarchar(256) NULL
,TfsWorkItemId nvarchar(256) NULL
,TfsWorkItemOwner nvarchar(256) NULL

,AlertStageRowId int NOT NULL IDENTITY(1, 1)
,AlertRowId int NULL
,TableGuid uniqueidentifier NULL
,ManagedEntityRowId int NULL
,WorkflowRowId int NULL
,InsertReadyInd AS (ISNULL(ManagedEntityRowId + WorkflowRowId, 0))
,DWCreatedDateTime datetime NOT NULL DEFAULT(GETUTCDATE())
'
,1
,10000
)

COMMIT

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'AlertStage' AND TABLE_SCHEMA = 'Alert')
BEGIN
DECLARE @Statement nvarchar(max)

SELECT @Statement = 'CREATE TABLE Alert.AlertStage (' + StagingTableColumnDefinition + ')'
FROM StandardDatasetStagingArea
WHERE DatasetId = '$Config/DatasetId$'

EXECUTE (@Statement)
END
GO

IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_AlertStage_AlertGuidDBLastModifiedDateTimeResolutionStateAlertStageRowId')
BEGIN
CREATE INDEX IX_AlertStage_AlertGuidDBLastModifiedDateTimeResolutionStateAlertStageRowId ON Alert.AlertStage (AlertGuid, DBLastModifiedDateTime, ResolutionState, AlertStageRowId)
END
GO

EXEC DomainTableRegisterIndexOptimization
@TableName = 'AlertStage'
,@SchemaName = 'Alert'
,@DatasetId = '$Config/DatasetId$'
GO

GRANT SELECT, INSERT, UPDATE, DELETE ON Alert.AlertStage TO OpsMgrWriter
GO

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'AlertStage2Process' AND TABLE_SCHEMA = 'Alert')
BEGIN
CREATE TABLE Alert.AlertStage2Process (
DatasetId uniqueidentifier NOT NULL
,ManagementGroupGuid uniqueidentifier NOT NULL
,AlertGuid uniqueidentifier NOT NULL
,AlertProblemGuid uniqueidentifier NOT NULL
,ManagedEntityGuid uniqueidentifier NOT NULL
,AlertName nvarchar(256) NOT NULL
,AlertDescription nvarchar(max) NULL
,Severity tinyint NOT NULL
,Priority tinyint NOT NULL
,Category nvarchar(256) NOT NULL
,MonitorAlertInd bit NOT NULL
,WorkflowGuid uniqueidentifier NOT NULL
,RaisedDateTime datetime NOT NULL
,CreatedDateTime datetime NOT NULL
,ResolutionState tinyint NOT NULL
,Owner nvarchar(256) NULL
,TicketId nvarchar(256) NULL
,CustomField1 nvarchar(256) NULL
,CustomField2 nvarchar(256) NULL
,CustomField3 nvarchar(256) NULL
,CustomField4 nvarchar(256) NULL
,CustomField5 nvarchar(256) NULL
,CustomField6 nvarchar(256) NULL
,CustomField7 nvarchar(256) NULL
,CustomField8 nvarchar(256) NULL
,CustomField9 nvarchar(256) NULL
,CustomField10 nvarchar(256) NULL
,SiteName nvarchar(256) NULL
,AlertParams xml NULL
,ParameterHash uniqueidentifier NULL
,RepeatCount int NOT NULL
,AlertStringGuid uniqueidentifier NULL
,DBLastModifiedDateTime datetime NOT NULL
,DBLastModifiedByUserId nvarchar(256) NULL
,TfsWorkItemId nvarchar(256) NULL
,TfsWorkItemOwner nvarchar(256) NULL

,AlertStageRowId int NOT NULL
,AlertRowId int NULL
,TableGuid uniqueidentifier NULL
,ManagedEntityRowId int NULL
,WorkflowRowId int NULL
,DWCreatedDateTime datetime NOT NULL
)
END
ELSE
BEGIN
-- Table already exists, ensure TFS columns exist

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'AlertStage2Process' AND TABLE_SCHEMA = 'Alert'
AND COLUMN_NAME = N'TfsWorkItemId')
ALTER TABLE [Alert].[AlertStage2Process] ADD [TfsWorkItemId] nvarchar(256) NULL

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'AlertStage2Process' AND TABLE_SCHEMA = 'Alert'
AND COLUMN_NAME = N'TfsWorkItemOwner')
ALTER TABLE [Alert].[AlertStage2Process] ADD [TfsWorkItemOwner] nvarchar(256) NULL
END
GO


IF NOT EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'AlertGroom')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.AlertGroom AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.AlertGroom
@DatasetId uniqueidentifier
,@AggregationTypeId tinyint
,@TableGuid uniqueidentifier
,@CutoffDateTime datetime
,@MaxRowsToGroom int
,@RowsDeleted int OUTPUT
AS
BEGIN
SET NOCOUNT ON

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

SET @ErrorInd = 0

DECLARE
@MainTableName varchar(255)
,@TableName varchar(255)
,@Statement varchar(max)
,@DebugLevel tinyint
,@StandardDatasetAggregationStorageRowId int
,@SchemaName sysname

BEGIN TRY
SELECT
@DebugLevel = DebugLevel
,@SchemaName = SchemaName
FROM StandardDataset
WHERE DatasetId = @DatasetId

BEGIN TRAN

CREATE TABLE #AlertGroom (
AlertGuid uniqueidentifier NOT NULL
)

SELECT @MainTableName = BaseTableName + '_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')
FROM StandardDatasetAggregationStorage
WHERE (DatasetId = @DatasetId)
AND (AggregationTypeId = @AggregationTypeId)
AND (DependentTableInd = 0)

SET @Statement = 'INSERT #AlertGroom (AlertGuid)'
+ ' SELECT TOP ' + CAST(@MaxRowsToGroom AS varchar(15)) + ' AlertGuid'
+ ' FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@MainTableName)
+ ' WHERE ([DateTime] &lt; CONVERT(datetime, ''' + CONVERT(varchar(50), @CutoffDateTime, 120) + ''', 120))'

EXECUTE (@Statement)

SET @StandardDatasetAggregationStorageRowId = 0

WHILE EXISTS (SELECT *
FROM StandardDatasetAggregationStorage
WHERE (DatasetId = @DatasetId)
AND (AggregationTypeId = @AggregationTypeId)
AND (DependentTableInd = 1)
AND (StandardDatasetAggregationStorageRowId &gt; @StandardDatasetAggregationStorageRowId)
)
BEGIN
SELECT TOP 1
@StandardDatasetAggregationStorageRowId = StandardDatasetAggregationStorageRowId
,@TableName = BaseTableName + '_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')
FROM StandardDatasetAggregationStorage
WHERE (DatasetId = @DatasetId)
AND (AggregationTypeId = @AggregationTypeId)
AND (DependentTableInd = 1)
AND (StandardDatasetAggregationStorageRowId &gt; @StandardDatasetAggregationStorageRowId)
Order By StandardDatasetAggregationStorageRowId Asc

SET @Statement = 'DELETE d'
+ ' FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + ' d'
+ ' JOIN #AlertGroom a ON (d.AlertGuid = a.AlertGuid)'
EXECUTE (@Statement)
END

SET @Statement = 'DELETE d'
+ ' FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@MainTableName) + ' d'
+ ' JOIN #AlertGroom a ON (d.AlertGuid = a.AlertGuid)'
EXECUTE (@Statement)
SET @RowsDeleted = @@ROWCOUNT

DROP TABLE #AlertGroom

COMMIT

-- groom staging of data for rejected MGs
DELETE Alert.AlertStage
WHERE ManagementGroupGuid NOT IN (SELECT ManagementGroupGuid
FROM ManagementGroup mg
WHERE (ConnectConfirmedDateTime IS NOT NULL)
AND (ConnectRejectedInd = 0)
)
END TRY
BEGIN CATCH
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()

SET @ErrorInd = 1
END CATCH

-- report error if any
IF (@ErrorInd = 1)
BEGIN
IF (@DebugLevel &gt; 0)
BEGIN
DECLARE @DebugMessageText nvarchar(max)

SET @DebugMessageText = N'Failed to groom data for Alert data set. Error ' + CAST(@ErrorNumber AS varchar(15))
+ ', Procedure ' + @ErrorProcedure
+ ', Line ' + CAST(@ErrorLine AS varchar(15))
+ ', Message: '+ @ErrorMessageText

EXEC DebugMessageInsert
@DatasetId = @DatasetId
,@MessageLevel = 1
,@MessageText = @DebugMessageText
END

DECLARE @AdjustedErrorSeverity int

SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity &gt; 18 THEN 18
ELSE @ErrorSeverity
END

RAISERROR (777971002, @AdjustedErrorSeverity, 1
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END

RETURN @RowsDeleted
END
GO

IF NOT EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'AlertProcessStaging')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.AlertProcessStaging AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.AlertProcessStaging
@DatasetId uniqueidentifier
AS
BEGIN
SET NOCOUNT ON

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

SET @ErrorInd = 0

BEGIN TRY
DECLARE
@InsertTableName sysname
,@InsertTableGuid uniqueidentifier
,@InsertStartedDateTime datetime
,@Statement nvarchar(max)
,@MessageText nvarchar(max)
,@OperationDurationMs bigint
,@ExecResult int
,@DebugLevel int
,@LockResourceName sysname
,@TableGuid uniqueidentifier
,@SchemaName sysname
,@MaxRowsToProcessCount int

SELECT
@DebugLevel = DebugLevel
,@SchemaName = SchemaName
FROM StandardDataset
WHERE DatasetId = @DatasetId

-- get max # of rows to process in one shot
SELECT @MaxRowsToProcessCount = MaxRowsToProcessPerTransactionCount
FROM StandardDatasetStagingArea
WHERE (DatasetId = @DatasetId)

IF (@MaxRowsToProcessCount IS NULL)
BEGIN
-- if max row count calue is not set default to 5000
SET @MaxRowsToProcessCount = 5000
END

-- delete old entries
DECLARE @MaxDataAgeDays int

SELECT @MaxDataAgeDays = MaxDataAgeDays
FROM StandardDatasetAggregation
WHERE (DatasetId = @DatasetId)
AND (AggregationTypeId = 0)

DELETE TOP (@MaxRowsToProcessCount)
FROM Alert.AlertStage
WHERE (DatasetId = @DatasetId)
AND (DWCreatedDateTime &lt; DATEADD(day, -@MaxDataAgeDays, GETUTCDATE()))

-- update managed entity ids
UPDATE s
SET ManagedEntityRowId = me.ManagedEntityRowId
FROM Alert.AlertStage s
JOIN vManagementGroup mg ON (s.ManagementGroupGuid = mg.ManagementGroupGuid)
JOIN vManagedEntity me ON ((s.ManagedEntityGuid = me.ManagedEntityGuid) AND (mg.ManagementGroupRowId = me.ManagementGroupRowId))
WHERE (s.ManagedEntityRowId IS NULL)

-- update workflow ids
UPDATE s
SET WorkflowRowId = m.MonitorRowId
FROM Alert.AlertStage s
JOIN vMonitor m ON (s.WorkflowGuid = m.MonitorGuid)
WHERE (s.MonitorAlertInd = 1)
AND (s.WorkflowRowId IS NULL)

UPDATE s
SET WorkflowRowId = r.RuleRowId
FROM Alert.AlertStage s
JOIN vRule r ON (s.WorkflowGuid = r.RuleGuid)
WHERE (s.MonitorAlertInd = 0)
AND (s.WorkflowRowId IS NULL)

BEGIN TRAN

-- lock table map to ensure we insert into table opened for insertion
SET @LockResourceName = CAST(@DatasetId AS varchar(50)) + '_TableMap'

EXEC @ExecResult = sp_getapplock
@Resource = @LockResourceName
,@LockMode = 'Shared'
,@LockOwner = 'Transaction'

IF (@ExecResult &lt; 0)
BEGIN
RAISERROR(777971001, 16, 1, 'Shared:StandardDatasetTableMap', @ExecResult)
END

EXEC dbo.StandardDatasetGetInsertTableGuid @DatasetId, 0, @InsertTableGuid OUTPUT

SELECT @InsertTableName = BaseTableName + '_' + REPLACE(CAST(@InsertTableGuid AS varchar(50)), '-', '')
FROM StandardDatasetAggregationStorage
WHERE (DatasetId = @DatasetId)
AND (AggregationTypeId = 0)
AND (DependentTableInd = 0)

IF (@DebugLevel &gt; 3)
BEGIN
SELECT @MessageText = 'Starting to insert alert(s) into ' + @InsertTableName

SET @InsertStartedDateTime = GETUTCDATE()

EXEC DebugMessageInsert
@DatasetId = @DatasetId
,@MessageLevel = 4
,@MessageText = @MessageText
END

-- calculate alert tables and row ids
DECLARE @VisitedPartition TABLE (
PartitionGuid uniqueidentifier
)

WHILE EXISTS (SELECT *
FROM Alert.AlertStage s
CROSS JOIN StandardDatasetTableMap m
WHERE (s.AlertRowId IS NULL)
AND (m.DatasetId = @DatasetId)
AND (m.AggregationTypeId = 0)
AND ((s.RaisedDateTime BETWEEN m.StartDateTime and m.EndDateTime) OR (m.InsertInd = 1))
AND (NOT EXISTS (SELECT * FROM @VisitedPartition WHERE (PartitionGuid = m.TableGuid)))
)
BEGIN
SELECT TOP 1
@TableGuid = m.TableGuid
FROM Alert.AlertStage s
CROSS JOIN StandardDatasetTableMap m
WHERE (s.AlertRowId IS NULL)
AND (m.DatasetId = @DatasetId)
AND (m.AggregationTypeId = 0)
AND (s.RaisedDateTime BETWEEN ISNULL(m.StartDateTime, '19000101') AND ISNULL(m.EndDateTime, '99991231'))
AND (NOT EXISTS (SELECT * FROM @VisitedPartition WHERE (PartitionGuid = m.TableGuid)))
ORDER BY m.StandardDatasetTableMapRowId

INSERT @VisitedPartition VALUES (@TableGuid)

SET @Statement =
'UPDATE s'
+ ' SET AlertRowId = a.AlertRowId'
+ ' ,TableGuid = ''' + CAST(@TableGuid AS varchar(50)) + ''''
+ ' FROM Alert.AlertStage s'
+ ' JOIN ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('Alert_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' a ON (s.AlertGuid = a.AlertGuid)'
+ ' WHERE (s.AlertRowId IS NULL)'
EXECUTE (@Statement)
END

-- check to see if AlertStage2Process table is not empty
DECLARE @AlertStage2ProcessRowCount int
DECLARE @SpaceUsedInfo TABLE (
[name] sysname
,[rows] int
,reserved nvarchar(100)
,data nvarchar(100)
,index_size nvarchar(100)
,unused nvarchar(100)
)

INSERT @SpaceUsedInfo
EXEC sp_spaceused 'Alert.AlertStage2Process'

SELECT @AlertStage2ProcessRowCount = [rows]
FROM @SpaceUsedInfo

IF (@AlertStage2ProcessRowCount = 0)
BEGIN
-- move some rows to processing table if it is empty

BEGIN TRAN

INSERT Alert.AlertStage2Process (
DatasetId
,ManagementGroupGuid
,AlertGuid
,AlertProblemGuid
,ManagedEntityGuid
,AlertName
,AlertDescription
,Severity
,Priority
,Category
,MonitorAlertInd
,WorkflowGuid
,RaisedDateTime
,CreatedDateTime
,ResolutionState
,Owner
,TicketId
,CustomField1
,CustomField2
,CustomField3
,CustomField4
,CustomField5
,CustomField6
,CustomField7
,CustomField8
,CustomField9
,CustomField10
,SiteName
,AlertParams
,ParameterHash
,RepeatCount
,AlertStringGuid
,DBLastModifiedDateTime
,DBLastModifiedByUserId

,AlertStageRowId
,AlertRowId
,TableGuid
,ManagedEntityRowId
,WorkflowRowId
,DWCreatedDateTime
,TfsWorkItemId
,TfsWorkItemOwner
)
SELECT TOP (@MaxRowsToProcessCount)
DatasetId
,ManagementGroupGuid
,AlertGuid
,AlertProblemGuid
,ManagedEntityGuid
,AlertName
,AlertDescription
,Severity
,Priority
,Category
,MonitorAlertInd
,WorkflowGuid
,RaisedDateTime
,CreatedDateTime
,ResolutionState
,Owner
,TicketId
,CustomField1
,CustomField2
,CustomField3
,CustomField4
,CustomField5
,CustomField6
,CustomField7
,CustomField8
,CustomField9
,CustomField10
,SiteName
,AlertParams
,ParameterHash
,RepeatCount
,AlertStringGuid
,DBLastModifiedDateTime
,DBLastModifiedByUserId

,AlertStageRowId
,AlertRowId
,TableGuid
,ManagedEntityRowId
,WorkflowRowId
,DWCreatedDateTime
,TfsWorkItemId
,TfsWorkItemOwner
FROM Alert.AlertStage s
WHERE (s.AlertStageRowId = (SELECT TOP 1 AlertStageRowId
FROM Alert.AlertStage
WHERE (AlertGuid = s.AlertGuid)
ORDER BY DBLastModifiedDateTime, ResolutionState, AlertStageRowId)
)
AND (s.InsertReadyInd &gt; 0)

DELETE s
FROM Alert.AlertStage s
JOIN Alert.AlertStage2Process s2p ON (s2p.AlertStageRowId = s.AlertStageRowId)

COMMIT
END

-- work only with rows in processing table

IF (EXISTS (SELECT * FROM Alert.AlertStage2Process WHERE (AlertRowId IS NULL)))
BEGIN
-- we have new alerts in the staging area
-- process only the first "change" since there
-- may be multiple changes stored in staging at
-- the same time, if that's the case - we'll pick
-- up all other changes next time we process staging
SET @Statement =
'INSERT ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@InsertTableName) + ' ('
+ ' AlertGuid'
+ ' ,AlertProblemGuid'
+ ' ,ManagedEntityRowId'
+ ' ,AlertName'
+ ' ,AlertDescription'
+ ' ,Severity'
+ ' ,Priority'
+ ' ,Category'
+ ' ,WorkflowRowId'
+ ' ,MonitorAlertInd'
+ ' ,[DateTime]'
+ ' ,SiteName'
+ ' ,RepeatCount'
+ ' ,AlertStringGuid'
+ ' ,ParameterHash'
+ ' ,DBCreatedDateTime'
+ ' )'
+ ' SELECT'
+ ' s.AlertGuid'
+ ' ,s.AlertProblemGuid'
+ ' ,s.ManagedEntityRowId'
+ ' ,s.AlertName'
+ ' ,s.AlertDescription'
+ ' ,s.Severity'
+ ' ,s.Priority'
+ ' ,s.Category'
+ ' ,s.WorkflowRowId'
+ ' ,s.MonitorAlertInd'
+ ' ,s.RaisedDateTime'
+ ' ,s.SiteName'
+ ' ,s.RepeatCount'
+ ' ,NULLIF(s.AlertStringGuid, ''00000000-0000-0000-0000-000000000000'')'
+ ' ,NULLIF(s.ParameterHash, ''00000000-0000-0000-0000-000000000000'')'
+ ' ,s.CreatedDateTime'
+ ' FROM Alert.AlertStage2Process s'
+ ' WHERE (s.AlertRowId IS NULL)'
EXECUTE (@Statement)

-- insert alert parameters
CREATE TABLE #AlertParameter
(
AlertParameterRowId int IDENTITY(1, 1)
,AlertGuid uniqueidentifier NOT NULL
,ParameterIndex tinyint NULL
,ParameterValue nvarchar(255) NULL
)

INSERT #AlertParameter (
AlertGuid
,ParameterValue
)
SELECT
s.AlertGuid
,xml.ParameterValue.value('.', 'nvarchar(255)')
FROM Alert.AlertStage2Process s
CROSS APPLY s.AlertParams.nodes('AlertParameters/*') as xml(ParameterValue)
WHERE (s.AlertRowId IS NULL)

-- set parameter indexes

UPDATE ap
SET ap.ParameterIndex = ap.AlertParameterRowId - ap1.AlertParameterRowId + 1
FROM #AlertParameter ap
JOIN #AlertParameter ap1 ON (ap.AlertGuid = ap1.AlertGuid)
WHERE NOT EXISTS (SELECT *
FROM #AlertParameter
WHERE (AlertGuid = ap1.AlertGuid)
AND (AlertParameterRowId &lt; ap1.AlertParameterRowId)
)

SET @Statement =
'INSERT ' + QUOTENAME(@SchemaName) + '.' + 'AlertParameter_' + REPLACE(CAST(@InsertTableGuid AS varchar(50)), '-', '') + '('
+ ' AlertGuid'
+ ' ,ParameterIndex'
+ ' ,ParameterValue'
+ ' )'
+ ' SELECT '
+ ' AlertGuid'
+ ' ,ParameterIndex'
+ ' ,ParameterValue'
+ ' FROM #AlertParameter'
EXECUTE (@Statement)

DROP TABLE #AlertParameter

-- retrieve created alert ids
SET @Statement =
'UPDATE s'
+ ' SET AlertRowId = a.AlertRowId'
+ ' ,TableGuid = ''' + CAST(@InsertTableGuid AS varchar(50)) + ''''
+ ' FROM Alert.AlertStage2Process s'
+ ' JOIN ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@InsertTableName) + ' a ON (s.AlertGuid = a.AlertGuid)'
+ ' WHERE (s.AlertRowId IS NULL)'
EXECUTE (@Statement)
END

IF (EXISTS (SELECT * FROM Alert.AlertStage2Process WHERE (AlertRowId IS NOT NULL)))
BEGIN
-- process alert updates

-- build unique list of tables affected
DECLARE @AffectedPartition TABLE (
PartitionRowId int IDENTITY(1, 1)
,TableGuid uniqueidentifier
)

INSERT @AffectedPartition(TableGuid)
SELECT DISTINCT TableGuid
FROM Alert.AlertStage2Process
WHERE (AlertRowId IS NOT NULL)

DECLARE @PartitionRowId int

SET @PartitionRowId = 0

WHILE (EXISTS (SELECT * FROM @AffectedPartition WHERE (PartitionRowId &gt; @PartitionRowId)))
BEGIN
SELECT TOP 1
@PartitionRowId = PartitionRowId
,@TableGuid = TableGuid
FROM @AffectedPartition
WHERE (PartitionRowId &gt; @PartitionRowId)

-- update alert repeat count
SET @Statement =
'UPDATE a'
+ ' SET RepeatCount = s.RepeatCount'
+ ' ,DWLastModifiedDateTime = GETUTCDATE()'
+ ' FROM Alert.AlertStage2Process s'
+ ' JOIN ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('Alert_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' a'
+ ' ON (s.AlertRowId = a.AlertRowId)'
+ ' WHERE (s.RepeatCount &gt; a.RepeatCount)'
EXECUTE (@Statement)

-- check which alerts have resolution state changed
CREATE TABLE #ResolutionState (
AlertStageRowId int NOT NULL
,AlertGuid uniqueidentifier NOT NULL
,LastResolutionState tinyint NULL
)

SET @Statement =
'INSERT #ResolutionState ('
+ ' AlertStageRowId'
+ ' ,AlertGuid'
+ ' ,LastResolutionState'
+ ')'
+ ' SELECT'
+ ' s.AlertStageRowId'
+ ' ,s.AlertGuid'
+ ' ,r.ResolutionState'
+ ' FROM Alert.AlertStage2Process s'
+ ' LEFT JOIN ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertResolutionState_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' r'
+ ' ON (s.AlertGuid = r.AlertGuid) AND (r.AlertResolutionStateRowId = (SELECT TOP 1 AlertResolutionStateRowId FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertResolutionState_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' WHERE (AlertGuid = s.AlertGuid) AND (StateSetDateTime &lt;= s.DBLastModifiedDateTime) ORDER BY StateSetDateTime DESC, ResolutionState DESC))'
+ ' WHERE (s.AlertRowId IS NOT NULL)'
+ ' AND (s.TableGuid = ''' + CAST(@TableGuid AS varchar(50)) + ''')'
EXECUTE (@Statement)

-- insert resolution state changes
SET @Statement =
'INSERT ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertResolutionState_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' ('
+ ' AlertGuid'
+ ' ,ResolutionState'
+ ' ,TimeFromRaisedSeconds'
+ ' ,StateSetDateTime'
+ ' ,StateSetByUserId'
+ ' )'
+ ' SELECT'
+ ' s.AlertGuid'
+ ' ,s.ResolutionState'
+ ' ,CASE ' -- check to see if alert was raised way in the past/future
+ ' WHEN ISNULL(ABS(DATEDIFF(year, s.DBLastModifiedDateTime, s.RaisedDateTime)), 0) &gt; 3 THEN 3*365*24*60*60 '
+ ' ELSE ISNULL(ABS(DATEDIFF(second, s.DBLastModifiedDateTime, s.RaisedDateTime)), 0) '
+ ' END '
+ ' ,s.DBLastModifiedDateTime'
+ ' ,s.DBLastModifiedByUserId'
+ ' FROM #ResolutionState r'
+ ' JOIN Alert.AlertStage2Process s ON (r.AlertStageRowId = s.AlertStageRowId)'
+ ' WHERE (s.ResolutionState &lt;&gt; r.LastResolutionState) OR (r.LastResolutionState IS NULL)'
EXECUTE (@Statement)

-- update all "time in state" columns since
-- we've added some state transitions potentially "in the middle"
SET @Statement =
'UPDATE ars'
+ ' SET TimeInStateSeconds = ISNULL(ABS(DATEDIFF(second, ars.StateSetDateTime, ars2.StateSetDateTime)), -1)'
+ ' FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertResolutionState_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' ars'
+ ' JOIN ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertResolutionState_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' ars2'
+ ' ON (ars.AlertGuid = ars2.AlertGuid)'
+ ' JOIN (SELECT DISTINCT AlertGuid = s.AlertGuid'
+ ' FROM #ResolutionState r'
+ ' JOIN Alert.AlertStage2Process s ON (r.AlertStageRowId = s.AlertStageRowId)'
+ ' WHERE (s.ResolutionState &lt;&gt; r.LastResolutionState) OR (r.LastResolutionState IS NULL)'
+ ' ) AS al ON (ars.AlertGuid = al.AlertGuid)'
+ ' WHERE (ars2.AlertResolutionStateRowId = (SELECT TOP 1 AlertResolutionStateRowId'
+ ' FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertResolutionState_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', ''))
+ ' WHERE (AlertGuid = ars.AlertGuid)'
+ ' AND (StateSetDateTime &gt;= ars.StateSetDateTime)'
+ ' AND (AlertResolutionStateRowId &lt;&gt; ars.AlertResolutionStateRowId)'
+ ' ORDER BY StateSetDateTime, ResolutionState DESC'
+ ' ))'
EXECUTE (@Statement)

DROP TABLE #ResolutionState

-- check to see if alert properties were updated
CREATE TABLE #AlertDetail (
AlertStageRowId int NOT NULL
,DetailRecordExistedInd bit NOT NULL
,Owner nvarchar(256) NULL
,TicketId nvarchar(256) NULL
,CustomField1 nvarchar(256) NULL
,CustomField2 nvarchar(256) NULL
,CustomField3 nvarchar(256) NULL
,CustomField4 nvarchar(256) NULL
,CustomField5 nvarchar(256) NULL
,CustomField6 nvarchar(256) NULL
,CustomField7 nvarchar(256) NULL
,CustomField8 nvarchar(256) NULL
,CustomField9 nvarchar(256) NULL
,CustomField10 nvarchar(256) NULL
,TfsWorkItemId nvarchar(256) NULL
,TfsWorkItemOwner nvarchar(256) NULL
)

SET @Statement =
'INSERT #AlertDetail ('
+ ' AlertStageRowId'
+ ' ,DetailRecordExistedInd'
+ ' ,Owner'
+ ' ,TicketId'
+ ' ,CustomField1'
+ ' ,CustomField2'
+ ' ,CustomField3'
+ ' ,CustomField4'
+ ' ,CustomField5'
+ ' ,CustomField6'
+ ' ,CustomField7'
+ ' ,CustomField8'
+ ' ,CustomField9'
+ ' ,CustomField10'
+ ' ,TfsWorkItemId'
+ ' ,TfsWorkItemOwner'
+ ')'
+ ' SELECT'
+ ' s.AlertStageRowId'
+ ' ,CASE WHEN d.AlertGuid IS NULL THEN 0 ELSE 1 END'
+ ' ,d.Owner'
+ ' ,d.TicketId'
+ ' ,d.CustomField1'
+ ' ,d.CustomField2'
+ ' ,d.CustomField3'
+ ' ,d.CustomField4'
+ ' ,d.CustomField5'
+ ' ,d.CustomField6'
+ ' ,d.CustomField7'
+ ' ,d.CustomField8'
+ ' ,d.CustomField9'
+ ' ,d.CustomField10'
+ ' ,d.TfsWorkItemId'
+ ' ,d.TfsWorkItemOwner'
+ ' FROM Alert.AlertStage2Process s'
+ ' LEFT JOIN ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertDetail_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' d ON (s.AlertGuid = d.AlertGuid)'
+ ' WHERE (s.AlertRowId IS NOT NULL)'
+ ' AND (s.TableGuid = ''' + CAST(@TableGuid AS varchar(50)) + ''')'
+ ' AND (NOT EXISTS (SELECT * FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertDetail_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' WHERE (AlertGuid = s.AlertGuid) AND (DBLastModifiedDateTime &lt;= s.DBLastModifiedDateTime) AND (AlertDetailRowId &gt; d.AlertDetailRowId)))'
EXECUTE (@Statement)

-- insert alert detail changes
SET @Statement =
'INSERT ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertDetail_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' ('
+ ' AlertGuid'
+ ' ,Owner'
+ ' ,TicketId'
+ ' ,CustomField1'
+ ' ,CustomField2'
+ ' ,CustomField3'
+ ' ,CustomField4'
+ ' ,CustomField5'
+ ' ,CustomField6'
+ ' ,CustomField7'
+ ' ,CustomField8'
+ ' ,CustomField9'
+ ' ,CustomField10'
+ ' ,DBLastModifiedDateTime'
+ ' ,DBLastModifiedByUserId'
+ ' ,TfsWorkItemId'
+ ' ,TfsWorkItemOwner'
+ ' )'
+ ' SELECT'
+ ' s.AlertGuid'
+ ' ,s.Owner'
+ ' ,s.TicketId'
+ ' ,s.CustomField1'
+ ' ,s.CustomField2'
+ ' ,s.CustomField3'
+ ' ,s.CustomField4'
+ ' ,s.CustomField5'
+ ' ,s.CustomField6'
+ ' ,s.CustomField7'
+ ' ,s.CustomField8'
+ ' ,s.CustomField9'
+ ' ,s.CustomField10'
+ ' ,s.DBLastModifiedDateTime'
+ ' ,s.DBLastModifiedByUserId'
+ ' ,s.TfsWorkItemId'
+ ' ,s.TfsWorkItemOwner'
+ ' FROM #AlertDetail d'
+ ' JOIN Alert.AlertStage2Process s ON (d.AlertStageRowId = s.AlertStageRowId)'
+ ' WHERE (ISNULL(s.Owner, '''') &lt;&gt; ISNULL(d.Owner, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.TicketId, '''') &lt;&gt; ISNULL(d.TicketId, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField1, '''') &lt;&gt; ISNULL(d.CustomField1, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField2, '''') &lt;&gt; ISNULL(d.CustomField2, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField3, '''') &lt;&gt; ISNULL(d.CustomField3, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField4, '''') &lt;&gt; ISNULL(d.CustomField4, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField5, '''') &lt;&gt; ISNULL(d.CustomField5, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField6, '''') &lt;&gt; ISNULL(d.CustomField6, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField7, '''') &lt;&gt; ISNULL(d.CustomField7, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField8, '''') &lt;&gt; ISNULL(d.CustomField8, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField9, '''') &lt;&gt; ISNULL(d.CustomField9, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField10, '''') &lt;&gt; ISNULL(d.CustomField10, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.TfsWorkItemId, '''') &lt;&gt; ISNULL(d.TfsWorkItemId, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.TfsWorkItemOwner, '''') &lt;&gt; ISNULL(d.TfsWorkItemOwner, '''') COLLATE database_default)'
+ ' OR (d.DetailRecordExistedInd = 0)'
EXECUTE (@Statement)

DROP TABLE #AlertDetail

-- mark affected table as non-optimized
UPDATE StandardDatasetTableMap
SET OptimizedInd = 0
WHERE (DatasetId = @DatasetId)
AND (AggregationTypeId = 0)
AND (TableGuid = @TableGuid)
AND (InsertInd = 0)
END
END

TRUNCATE TABLE Alert.AlertStage2Process

IF (@DebugLevel &gt; 3)
BEGIN
SET @MessageText = 'Finished inserting alert(s) into ' + @InsertTableName
SET @OperationDurationMs = ABS(DATEDIFF(ms, GETUTCDATE(), @InsertStartedDateTime))

EXEC DebugMessageInsert
@DatasetId = @DatasetId
,@MessageLevel = 4
,@MessageText = @MessageText
,@OperationDurationMs = @OperationDurationMs
END

COMMIT
END TRY
BEGIN CATCH
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()

SET @ErrorInd = 1
END CATCH

-- report error if any
IF (@ErrorInd = 1)
BEGIN
IF (@DebugLevel &gt; 0)
BEGIN
DECLARE @DebugMessageText nvarchar(max)

SET @DebugMessageText = N'Failed to process alert staging area. Error ' + CAST(@ErrorNumber AS varchar(15))
+ ', Procedure ' + @ErrorProcedure
+ ', Line ' + CAST(@ErrorLine AS varchar(15))
+ ', Message: '+ @ErrorMessageText

EXEC DebugMessageInsert
@DatasetId = @DatasetId
,@MessageLevel = 1
,@MessageText = @DebugMessageText
END

DECLARE @AdjustedErrorSeverity int

SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity &gt; 18 THEN 18
ELSE @ErrorSeverity
END

RAISERROR (777971002, @AdjustedErrorSeverity, 1
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END
END
GO

</Install>
<Uninstall>
-- drop SPs
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'AlertGroom')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.AlertGroom')
END

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'AlertInsert')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.AlertInsert')
END

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'AlertProcessStaging')
BEGIN
EXECUTE ('DROP PROCEDURE dbo.AlertProcessStaging')
END

-- drop tables
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'AlertStage' AND TABLE_SCHEMA = 'Alert')
BEGIN
EXECUTE('DROP TABLE Alert.AlertStage')
END

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'AlertStage2Process' AND TABLE_SCHEMA = 'Alert')
BEGIN
EXECUTE('DROP TABLE Alert.AlertStage2Process')
END

-- delete std dataset related data
EXEC StandardDatasetDelete '$Config/DatasetId$'
GO

</Uninstall>
<Upgrade>
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'AlertStage2Process' AND TABLE_SCHEMA = 'Alert')
BEGIN
CREATE TABLE Alert.AlertStage2Process (
DatasetId uniqueidentifier NOT NULL
,ManagementGroupGuid uniqueidentifier NOT NULL
,AlertGuid uniqueidentifier NOT NULL
,AlertProblemGuid uniqueidentifier NOT NULL
,ManagedEntityGuid uniqueidentifier NOT NULL
,AlertName nvarchar(256) NOT NULL
,AlertDescription nvarchar(max) NULL
,Severity tinyint NOT NULL
,Priority tinyint NOT NULL
,Category nvarchar(256) NOT NULL
,MonitorAlertInd bit NOT NULL
,WorkflowGuid uniqueidentifier NOT NULL
,RaisedDateTime datetime NOT NULL
,CreatedDateTime datetime NOT NULL
,ResolutionState tinyint NOT NULL
,Owner nvarchar(256) NULL
,TicketId nvarchar(256) NULL
,CustomField1 nvarchar(256) NULL
,CustomField2 nvarchar(256) NULL
,CustomField3 nvarchar(256) NULL
,CustomField4 nvarchar(256) NULL
,CustomField5 nvarchar(256) NULL
,CustomField6 nvarchar(256) NULL
,CustomField7 nvarchar(256) NULL
,CustomField8 nvarchar(256) NULL
,CustomField9 nvarchar(256) NULL
,CustomField10 nvarchar(256) NULL
,SiteName nvarchar(256) NULL
,AlertParams xml NULL
,ParameterHash uniqueidentifier NULL
,RepeatCount int NOT NULL
,AlertStringGuid uniqueidentifier NULL
,DBLastModifiedDateTime datetime NOT NULL
,DBLastModifiedByUserId nvarchar(256) NULL
,TfsWorkItemId nvarchar(256) NULL
,TfsWorkItemOwner nvarchar(256) NULL

,AlertStageRowId int NOT NULL
,AlertRowId int NULL
,TableGuid uniqueidentifier NULL
,ManagedEntityRowId int NULL
,WorkflowRowId int NULL
,DWCreatedDateTime datetime NOT NULL
)
END
ELSE
BEGIN
-- Table already exists, ensure TFS columns exist

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'AlertStage2Process' AND TABLE_SCHEMA = 'Alert'
AND COLUMN_NAME = N'TfsWorkItemId')
ALTER TABLE [Alert].[AlertStage2Process] ADD [TfsWorkItemId] nvarchar(256) NULL

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'AlertStage2Process' AND TABLE_SCHEMA = 'Alert'
AND COLUMN_NAME = N'TfsWorkItemOwner')
ALTER TABLE [Alert].[AlertStage2Process] ADD [TfsWorkItemOwner] nvarchar(256) NULL
END
GO


-- Update Alert staging definition in StandardDatasetStagingArea
BEGIN TRAN

IF EXISTS (SELECT * FROM StandardDatasetStagingArea WHERE DatasetId = '$Config/DatasetId$')
BEGIN
DELETE StandardDatasetStagingArea
WHERE DatasetId = '$Config/DatasetId$'
END

INSERT StandardDatasetStagingArea
(
DatasetId
,StagingTableColumnDefinition
,BatchedProcessingSupportedInd
,MaxRowsToProcessPerTransactionCount
)
VALUES
(
'$Config/DatasetId$'
,'
DatasetId uniqueidentifier NOT NULL
,ManagementGroupGuid uniqueidentifier NOT NULL
,AlertGuid uniqueidentifier NOT NULL
,AlertProblemGuid uniqueidentifier NOT NULL
,ManagedEntityGuid uniqueidentifier NOT NULL
,AlertName nvarchar(256) NOT NULL
,AlertDescription nvarchar(max) NULL
,Severity tinyint NOT NULL
,Priority tinyint NOT NULL
,Category nvarchar(256) NOT NULL
,MonitorAlertInd bit NOT NULL
,WorkflowGuid uniqueidentifier NOT NULL
,RaisedDateTime datetime NOT NULL
,CreatedDateTime datetime NOT NULL
,ResolutionState tinyint NOT NULL
,Owner nvarchar(256) NULL
,TicketId nvarchar(256) NULL
,CustomField1 nvarchar(256) NULL
,CustomField2 nvarchar(256) NULL
,CustomField3 nvarchar(256) NULL
,CustomField4 nvarchar(256) NULL
,CustomField5 nvarchar(256) NULL
,CustomField6 nvarchar(256) NULL
,CustomField7 nvarchar(256) NULL
,CustomField8 nvarchar(256) NULL
,CustomField9 nvarchar(256) NULL
,CustomField10 nvarchar(256) NULL
,SiteName nvarchar(256) NULL
,AlertParams xml NULL
,ParameterHash uniqueidentifier NULL
,RepeatCount int NOT NULL
,AlertStringGuid uniqueidentifier NULL
,DBLastModifiedDateTime datetime NOT NULL
,DBLastModifiedByUserId nvarchar(256) NULL
,TfsWorkItemId nvarchar(256) NULL
,TfsWorkItemOwner nvarchar(256) NULL

,AlertStageRowId int NOT NULL IDENTITY(1, 1)
,AlertRowId int NULL
,TableGuid uniqueidentifier NULL
,ManagedEntityRowId int NULL
,WorkflowRowId int NULL
,InsertReadyInd AS (ISNULL(ManagedEntityRowId + WorkflowRowId, 0))
,DWCreatedDateTime datetime NOT NULL DEFAULT(GETUTCDATE())
'
,1
,10000
)

COMMIT

BEGIN TRAN
SET NOCOUNT ON

-- Need to place new columns above the standard columns, requires creation of a new table, copying data, then dropping old table
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'AlertStage' AND TABLE_SCHEMA = 'Alert')
BEGIN
-- Create the new table
DECLARE @Statement nvarchar(max)

SELECT @Statement = 'CREATE TABLE Alert.Tmp_AlertStage (' + StagingTableColumnDefinition + ')'
FROM StandardDatasetStagingArea
WHERE DatasetId = '$Config/DatasetId$'

EXECUTE (@Statement)

-- Copy over the data from the existing AlertStage
SET IDENTITY_INSERT Alert.Tmp_AlertStage ON
INSERT Alert.Tmp_AlertStage
(
DatasetId
,ManagementGroupGuid
,AlertGuid
,AlertProblemGuid
,ManagedEntityGuid
,AlertName
,AlertDescription
,Severity
,Priority
,Category
,MonitorAlertInd
,WorkflowGuid
,RaisedDateTime
,CreatedDateTime
,ResolutionState
,Owner
,TicketId
,CustomField1
,CustomField2
,CustomField3
,CustomField4
,CustomField5
,CustomField6
,CustomField7
,CustomField8
,CustomField9
,CustomField10
,SiteName
,AlertParams
,ParameterHash
,RepeatCount
,AlertStringGuid
,DBLastModifiedDateTime
,DBLastModifiedByUserId

,AlertStageRowId
,AlertRowId
,TableGuid
,ManagedEntityRowId
,WorkflowRowId
,DWCreatedDateTime
)
SELECT
DatasetId
,ManagementGroupGuid
,AlertGuid
,AlertProblemGuid
,ManagedEntityGuid
,AlertName
,AlertDescription
,Severity
,Priority
,Category
,MonitorAlertInd
,WorkflowGuid
,RaisedDateTime
,CreatedDateTime
,ResolutionState
,Owner
,TicketId
,CustomField1
,CustomField2
,CustomField3
,CustomField4
,CustomField5
,CustomField6
,CustomField7
,CustomField8
,CustomField9
,CustomField10
,SiteName
,AlertParams
,ParameterHash
,RepeatCount
,AlertStringGuid
,DBLastModifiedDateTime
,DBLastModifiedByUserId

,AlertStageRowId
,AlertRowId
,TableGuid
,ManagedEntityRowId
,WorkflowRowId
,DWCreatedDateTime
FROM Alert.AlertStage
SET IDENTITY_INSERT Alert.Tmp_AlertStage OFF

-- Remove the old table
DROP TABLE Alert.AlertStage

-- Rename the temp table to the real name
EXECUTE sp_rename N'Alert.Tmp_AlertStage', N'AlertStage', 'OBJECT'

-- Apply indexes and permissions
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_AlertStage_AlertGuidDBLastModifiedDateTimeResolutionStateAlertStageRowId')
BEGIN
CREATE INDEX IX_AlertStage_AlertGuidDBLastModifiedDateTimeResolutionStateAlertStageRowId ON Alert.AlertStage (AlertGuid, DBLastModifiedDateTime, ResolutionState, AlertStageRowId)
END

EXEC DomainTableRegisterIndexOptimization
@TableName = 'AlertStage'
,@SchemaName = 'Alert'
,@DatasetId = '$Config/DatasetId$'

GRANT SELECT, INSERT, UPDATE, DELETE ON Alert.AlertStage TO OpsMgrWriter
END

COMMIT

SET NOCOUNT ON

-- update AlertDetail table definition templates
UPDATE sdas
SET TableTemplate =
'
CREATE TABLE [Alert].[AlertDetail_$Guid$]
(
AlertDetailRowId int NOT NULL IDENTITY(1, 1)
,AlertGuid uniqueidentifier NOT NULL
,Owner nvarchar(256) NULL
,TicketId nvarchar(256) NULL
,CustomField1 nvarchar(256) NULL
,CustomField2 nvarchar(256) NULL
,CustomField3 nvarchar(256) NULL
,CustomField4 nvarchar(256) NULL
,CustomField5 nvarchar(256) NULL
,CustomField6 nvarchar(256) NULL
,CustomField7 nvarchar(256) NULL
,CustomField8 nvarchar(256) NULL
,CustomField9 nvarchar(256) NULL
,CustomField10 nvarchar(256) NULL
,DBLastModifiedDateTime datetime NOT NULL
,DBLastModifiedByUserId nvarchar(256) NULL
,DWCreatedDateTime datetime NOT NULL DEFAULT(GETUTCDATE())
,TfsWorkItemId nvarchar(256) NULL
,TfsWorkItemOwner nvarchar(256) NULL

,CONSTRAINT [PK_AlertDetail_$Guid$] PRIMARY KEY CLUSTERED (AlertDetailRowId) ON $DataFileGroupName$
) ON $DataFileGroupName$
'
,CoverViewSelectClause =
'SELECT
AlertGuid
,Owner
,TicketId
,CustomField1
,CustomField2
,CustomField3
,CustomField4
,CustomField5
,CustomField6
,CustomField7
,CustomField8
,CustomField9
,CustomField10
,DBLastModifiedDateTime
,DBLastModifiedByUserId
,DWCreatedDateTime
,TfsWorkItemId
,TfsWorkItemOwner
'
FROM StandardDatasetAggregationStorage sdas
JOIN StandardDataset sd ON (sdas.DatasetId = sd.DatasetId)
WHERE (sd.DatasetId = '$Config/DatasetId$')
AND (sdas.TableTag = 'detail')
AND (sdas.DependentTableInd = 1)
GO

-- update all tables that were already created
DECLARE
@StandardDatasetTableMapRowId int
,@Statement nvarchar(max)
,@SchemaName sysname
,@TableNameSuffix sysname
,@BaseTableName sysname
,@FullTableName sysname

SET @StandardDatasetTableMapRowId = 0

WHILE EXISTS (SELECT *
FROM StandardDatasetTableMap tm
WHERE (tm.StandardDatasetTableMapRowId &gt; @StandardDatasetTableMapRowId)
AND (tm.DatasetId = '$Config/DatasetId$')
AND (tm.InsertInd = 1)
)
BEGIN
SELECT TOP 1
@StandardDatasetTableMapRowId = tm.StandardDatasetTableMapRowId
,@SchemaName = sd.SchemaName
,@TableNameSuffix = tm.TableNameSuffix
,@BaseTableName = sdas.BaseTableName
FROM StandardDatasetTableMap tm
JOIN StandardDataset sd ON (tm.DatasetId = sd.DatasetId)
JOIN StandardDatasetAggregationStorage sdas ON (sdas.DatasetId = tm.DatasetId) AND (sdas.AggregationTypeId = tm.AggregationTypeId)
WHERE (tm.StandardDatasetTableMapRowId &gt; @StandardDatasetTableMapRowId)
AND (tm.DatasetId = '$Config/DatasetId$')
AND (tm.InsertInd = 1)
AND (sdas.TableTag = 'detail')
AND (sdas.DependentTableInd = 1)
ORDER BY tm.StandardDatasetTableMapRowId

SET @FullTableName = @BaseTableName + '_' + @TableNameSuffix

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @FullTableName AND TABLE_SCHEMA = @SchemaName
AND COLUMN_NAME = N'TfsWorkItemId')
BEGIN
SET @Statement = 'ALTER TABLE ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@FullTableName) + ' ADD TfsWorkItemId nvarchar(256) NULL'
EXECUTE (@Statement)
END

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @FullTableName AND TABLE_SCHEMA = @SchemaName
AND COLUMN_NAME = N'TfsWorkItemOwner')
BEGIN
SET @Statement = 'ALTER TABLE ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@FullTableName) + ' ADD TfsWorkItemOwner nvarchar(256) NULL'
EXECUTE (@Statement)
END
END
GO

-- alter cover views
EXEC StandardDatasetBuildCoverView '$Config/DatasetId$', 0
GO



IF NOT EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'AlertProcessStaging')
BEGIN
EXECUTE ('CREATE PROCEDURE dbo.AlertProcessStaging AS RETURN 1')
END
GO

ALTER PROCEDURE dbo.AlertProcessStaging
@DatasetId uniqueidentifier
AS
BEGIN
SET NOCOUNT ON

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

SET @ErrorInd = 0

BEGIN TRY
DECLARE
@InsertTableName sysname
,@InsertTableGuid uniqueidentifier
,@InsertStartedDateTime datetime
,@Statement nvarchar(max)
,@MessageText nvarchar(max)
,@OperationDurationMs bigint
,@ExecResult int
,@DebugLevel int
,@LockResourceName sysname
,@TableGuid uniqueidentifier
,@SchemaName sysname
,@MaxRowsToProcessCount int

SELECT
@DebugLevel = DebugLevel
,@SchemaName = SchemaName
FROM StandardDataset
WHERE DatasetId = @DatasetId

-- get max # of rows to process in one shot
SELECT @MaxRowsToProcessCount = MaxRowsToProcessPerTransactionCount
FROM StandardDatasetStagingArea
WHERE (DatasetId = @DatasetId)

IF (@MaxRowsToProcessCount IS NULL)
BEGIN
-- if max row count calue is not set default to 5000
SET @MaxRowsToProcessCount = 5000
END

-- delete old entries
DECLARE @MaxDataAgeDays int

SELECT @MaxDataAgeDays = MaxDataAgeDays
FROM StandardDatasetAggregation
WHERE (DatasetId = @DatasetId)
AND (AggregationTypeId = 0)

DELETE TOP (@MaxRowsToProcessCount)
FROM Alert.AlertStage
WHERE (DatasetId = @DatasetId)
AND (DWCreatedDateTime &lt; DATEADD(day, -@MaxDataAgeDays, GETUTCDATE()))

-- update managed entity ids
UPDATE s
SET ManagedEntityRowId = me.ManagedEntityRowId
FROM Alert.AlertStage s
JOIN vManagementGroup mg ON (s.ManagementGroupGuid = mg.ManagementGroupGuid)
JOIN vManagedEntity me ON ((s.ManagedEntityGuid = me.ManagedEntityGuid) AND (mg.ManagementGroupRowId = me.ManagementGroupRowId))
WHERE (s.ManagedEntityRowId IS NULL)

-- update workflow ids
UPDATE s
SET WorkflowRowId = m.MonitorRowId
FROM Alert.AlertStage s
JOIN vMonitor m ON (s.WorkflowGuid = m.MonitorGuid)
WHERE (s.MonitorAlertInd = 1)
AND (s.WorkflowRowId IS NULL)

UPDATE s
SET WorkflowRowId = r.RuleRowId
FROM Alert.AlertStage s
JOIN vRule r ON (s.WorkflowGuid = r.RuleGuid)
WHERE (s.MonitorAlertInd = 0)
AND (s.WorkflowRowId IS NULL)

BEGIN TRAN

-- lock table map to ensure we insert into table opened for insertion
SET @LockResourceName = CAST(@DatasetId AS varchar(50)) + '_TableMap'

EXEC @ExecResult = sp_getapplock
@Resource = @LockResourceName
,@LockMode = 'Shared'
,@LockOwner = 'Transaction'

IF (@ExecResult &lt; 0)
BEGIN
RAISERROR(777971001, 16, 1, 'Shared:StandardDatasetTableMap', @ExecResult)
END

EXEC dbo.StandardDatasetGetInsertTableGuid @DatasetId, 0, @InsertTableGuid OUTPUT

SELECT @InsertTableName = BaseTableName + '_' + REPLACE(CAST(@InsertTableGuid AS varchar(50)), '-', '')
FROM StandardDatasetAggregationStorage
WHERE (DatasetId = @DatasetId)
AND (AggregationTypeId = 0)
AND (DependentTableInd = 0)

IF (@DebugLevel &gt; 3)
BEGIN
SELECT @MessageText = 'Starting to insert alert(s) into ' + @InsertTableName

SET @InsertStartedDateTime = GETUTCDATE()

EXEC DebugMessageInsert
@DatasetId = @DatasetId
,@MessageLevel = 4
,@MessageText = @MessageText
END

-- calculate alert tables and row ids
DECLARE @VisitedPartition TABLE (
PartitionGuid uniqueidentifier
)

WHILE EXISTS (SELECT *
FROM Alert.AlertStage s
CROSS JOIN StandardDatasetTableMap m
WHERE (s.AlertRowId IS NULL)
AND (m.DatasetId = @DatasetId)
AND (m.AggregationTypeId = 0)
AND ((s.RaisedDateTime BETWEEN m.StartDateTime and m.EndDateTime) OR (m.InsertInd = 1))
AND (NOT EXISTS (SELECT * FROM @VisitedPartition WHERE (PartitionGuid = m.TableGuid)))
)
BEGIN
SELECT TOP 1
@TableGuid = m.TableGuid
FROM Alert.AlertStage s
CROSS JOIN StandardDatasetTableMap m
WHERE (s.AlertRowId IS NULL)
AND (m.DatasetId = @DatasetId)
AND (m.AggregationTypeId = 0)
AND (s.RaisedDateTime BETWEEN ISNULL(m.StartDateTime, '19000101') AND ISNULL(m.EndDateTime, '99991231'))
AND (NOT EXISTS (SELECT * FROM @VisitedPartition WHERE (PartitionGuid = m.TableGuid)))
ORDER BY m.StandardDatasetTableMapRowId

INSERT @VisitedPartition VALUES (@TableGuid)

SET @Statement =
'UPDATE s'
+ ' SET AlertRowId = a.AlertRowId'
+ ' ,TableGuid = ''' + CAST(@TableGuid AS varchar(50)) + ''''
+ ' FROM Alert.AlertStage s'
+ ' JOIN ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('Alert_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' a ON (s.AlertGuid = a.AlertGuid)'
+ ' WHERE (s.AlertRowId IS NULL)'
EXECUTE (@Statement)
END

-- check to see if AlertStage2Process table is not empty
DECLARE @AlertStage2ProcessRowCount int
DECLARE @SpaceUsedInfo TABLE (
[name] sysname
,[rows] int
,reserved nvarchar(100)
,data nvarchar(100)
,index_size nvarchar(100)
,unused nvarchar(100)
)

INSERT @SpaceUsedInfo
EXEC sp_spaceused 'Alert.AlertStage2Process'

SELECT @AlertStage2ProcessRowCount = [rows]
FROM @SpaceUsedInfo

IF (@AlertStage2ProcessRowCount = 0)
BEGIN
-- move some rows to processing table if it is empty

BEGIN TRAN

INSERT Alert.AlertStage2Process (
DatasetId
,ManagementGroupGuid
,AlertGuid
,AlertProblemGuid
,ManagedEntityGuid
,AlertName
,AlertDescription
,Severity
,Priority
,Category
,MonitorAlertInd
,WorkflowGuid
,RaisedDateTime
,CreatedDateTime
,ResolutionState
,Owner
,TicketId
,CustomField1
,CustomField2
,CustomField3
,CustomField4
,CustomField5
,CustomField6
,CustomField7
,CustomField8
,CustomField9
,CustomField10
,SiteName
,AlertParams
,ParameterHash
,RepeatCount
,AlertStringGuid
,DBLastModifiedDateTime
,DBLastModifiedByUserId

,AlertStageRowId
,AlertRowId
,TableGuid
,ManagedEntityRowId
,WorkflowRowId
,DWCreatedDateTime
,TfsWorkItemId
,TfsWorkItemOwner
)
SELECT TOP (@MaxRowsToProcessCount)
DatasetId
,ManagementGroupGuid
,AlertGuid
,AlertProblemGuid
,ManagedEntityGuid
,AlertName
,AlertDescription
,Severity
,Priority
,Category
,MonitorAlertInd
,WorkflowGuid
,RaisedDateTime
,CreatedDateTime
,ResolutionState
,Owner
,TicketId
,CustomField1
,CustomField2
,CustomField3
,CustomField4
,CustomField5
,CustomField6
,CustomField7
,CustomField8
,CustomField9
,CustomField10
,SiteName
,AlertParams
,ParameterHash
,RepeatCount
,AlertStringGuid
,DBLastModifiedDateTime
,DBLastModifiedByUserId

,AlertStageRowId
,AlertRowId
,TableGuid
,ManagedEntityRowId
,WorkflowRowId
,DWCreatedDateTime
,TfsWorkItemId
,TfsWorkItemOwner
FROM Alert.AlertStage s
WHERE (s.AlertStageRowId = (SELECT TOP 1 AlertStageRowId
FROM Alert.AlertStage
WHERE (AlertGuid = s.AlertGuid)
ORDER BY DBLastModifiedDateTime, ResolutionState, AlertStageRowId)
)
AND (s.InsertReadyInd &gt; 0)

DELETE s
FROM Alert.AlertStage s
JOIN Alert.AlertStage2Process s2p ON (s2p.AlertStageRowId = s.AlertStageRowId)

COMMIT
END

-- work only with rows in processing table

IF (EXISTS (SELECT * FROM Alert.AlertStage2Process WHERE (AlertRowId IS NULL)))
BEGIN
-- we have new alerts in the staging area
-- process only the first "change" since there
-- may be multiple changes stored in staging at
-- the same time, if that's the case - we'll pick
-- up all other changes next time we process staging
SET @Statement =
'INSERT ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@InsertTableName) + ' ('
+ ' AlertGuid'
+ ' ,AlertProblemGuid'
+ ' ,ManagedEntityRowId'
+ ' ,AlertName'
+ ' ,AlertDescription'
+ ' ,Severity'
+ ' ,Priority'
+ ' ,Category'
+ ' ,WorkflowRowId'
+ ' ,MonitorAlertInd'
+ ' ,[DateTime]'
+ ' ,SiteName'
+ ' ,RepeatCount'
+ ' ,AlertStringGuid'
+ ' ,ParameterHash'
+ ' ,DBCreatedDateTime'
+ ' )'
+ ' SELECT'
+ ' s.AlertGuid'
+ ' ,s.AlertProblemGuid'
+ ' ,s.ManagedEntityRowId'
+ ' ,s.AlertName'
+ ' ,s.AlertDescription'
+ ' ,s.Severity'
+ ' ,s.Priority'
+ ' ,s.Category'
+ ' ,s.WorkflowRowId'
+ ' ,s.MonitorAlertInd'
+ ' ,s.RaisedDateTime'
+ ' ,s.SiteName'
+ ' ,s.RepeatCount'
+ ' ,NULLIF(s.AlertStringGuid, ''00000000-0000-0000-0000-000000000000'')'
+ ' ,NULLIF(s.ParameterHash, ''00000000-0000-0000-0000-000000000000'')'
+ ' ,s.CreatedDateTime'
+ ' FROM Alert.AlertStage2Process s'
+ ' WHERE (s.AlertRowId IS NULL)'
EXECUTE (@Statement)

-- insert alert parameters
CREATE TABLE #AlertParameter
(
AlertParameterRowId int IDENTITY(1, 1)
,AlertGuid uniqueidentifier NOT NULL
,ParameterIndex tinyint NULL
,ParameterValue nvarchar(255) NULL
)

INSERT #AlertParameter (
AlertGuid
,ParameterValue
)
SELECT
s.AlertGuid
,xml.ParameterValue.value('.', 'nvarchar(255)')
FROM Alert.AlertStage2Process s
CROSS APPLY s.AlertParams.nodes('AlertParameters/*') as xml(ParameterValue)
WHERE (s.AlertRowId IS NULL)

-- set parameter indexes

UPDATE ap
SET ap.ParameterIndex = ap.AlertParameterRowId - ap1.AlertParameterRowId + 1
FROM #AlertParameter ap
JOIN #AlertParameter ap1 ON (ap.AlertGuid = ap1.AlertGuid)
WHERE NOT EXISTS (SELECT *
FROM #AlertParameter
WHERE (AlertGuid = ap1.AlertGuid)
AND (AlertParameterRowId &lt; ap1.AlertParameterRowId)
)

SET @Statement =
'INSERT ' + QUOTENAME(@SchemaName) + '.' + 'AlertParameter_' + REPLACE(CAST(@InsertTableGuid AS varchar(50)), '-', '') + '('
+ ' AlertGuid'
+ ' ,ParameterIndex'
+ ' ,ParameterValue'
+ ' )'
+ ' SELECT '
+ ' AlertGuid'
+ ' ,ParameterIndex'
+ ' ,ParameterValue'
+ ' FROM #AlertParameter'
EXECUTE (@Statement)

DROP TABLE #AlertParameter

-- retrieve created alert ids
SET @Statement =
'UPDATE s'
+ ' SET AlertRowId = a.AlertRowId'
+ ' ,TableGuid = ''' + CAST(@InsertTableGuid AS varchar(50)) + ''''
+ ' FROM Alert.AlertStage2Process s'
+ ' JOIN ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@InsertTableName) + ' a ON (s.AlertGuid = a.AlertGuid)'
+ ' WHERE (s.AlertRowId IS NULL)'
EXECUTE (@Statement)
END

IF (EXISTS (SELECT * FROM Alert.AlertStage2Process WHERE (AlertRowId IS NOT NULL)))
BEGIN
-- process alert updates

-- build unique list of tables affected
DECLARE @AffectedPartition TABLE (
PartitionRowId int IDENTITY(1, 1)
,TableGuid uniqueidentifier
)

INSERT @AffectedPartition(TableGuid)
SELECT DISTINCT TableGuid
FROM Alert.AlertStage2Process
WHERE (AlertRowId IS NOT NULL)

DECLARE @PartitionRowId int

SET @PartitionRowId = 0

WHILE (EXISTS (SELECT * FROM @AffectedPartition WHERE (PartitionRowId &gt; @PartitionRowId)))
BEGIN
SELECT TOP 1
@PartitionRowId = PartitionRowId
,@TableGuid = TableGuid
FROM @AffectedPartition
WHERE (PartitionRowId &gt; @PartitionRowId)

-- update alert repeat count
SET @Statement =
'UPDATE a'
+ ' SET RepeatCount = s.RepeatCount'
+ ' ,DWLastModifiedDateTime = GETUTCDATE()'
+ ' FROM Alert.AlertStage2Process s'
+ ' JOIN ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('Alert_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' a'
+ ' ON (s.AlertRowId = a.AlertRowId)'
+ ' WHERE (s.RepeatCount &gt; a.RepeatCount)'
EXECUTE (@Statement)

-- check which alerts have resolution state changed
CREATE TABLE #ResolutionState (
AlertStageRowId int NOT NULL
,AlertGuid uniqueidentifier NOT NULL
,LastResolutionState tinyint NULL
)

SET @Statement =
'INSERT #ResolutionState ('
+ ' AlertStageRowId'
+ ' ,AlertGuid'
+ ' ,LastResolutionState'
+ ')'
+ ' SELECT'
+ ' s.AlertStageRowId'
+ ' ,s.AlertGuid'
+ ' ,r.ResolutionState'
+ ' FROM Alert.AlertStage2Process s'
+ ' LEFT JOIN ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertResolutionState_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' r'
+ ' ON (s.AlertGuid = r.AlertGuid) AND (r.AlertResolutionStateRowId = (SELECT TOP 1 AlertResolutionStateRowId FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertResolutionState_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' WHERE (AlertGuid = s.AlertGuid) AND (StateSetDateTime &lt;= s.DBLastModifiedDateTime) ORDER BY StateSetDateTime DESC, ResolutionState DESC))'
+ ' WHERE (s.AlertRowId IS NOT NULL)'
+ ' AND (s.TableGuid = ''' + CAST(@TableGuid AS varchar(50)) + ''')'
EXECUTE (@Statement)

-- insert resolution state changes
SET @Statement =
'INSERT ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertResolutionState_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' ('
+ ' AlertGuid'
+ ' ,ResolutionState'
+ ' ,TimeFromRaisedSeconds'
+ ' ,StateSetDateTime'
+ ' ,StateSetByUserId'
+ ' )'
+ ' SELECT'
+ ' s.AlertGuid'
+ ' ,s.ResolutionState'
+ ' ,CASE ' -- check to see if alert was raised way in the past/future
+ ' WHEN ISNULL(ABS(DATEDIFF(year, s.DBLastModifiedDateTime, s.RaisedDateTime)), 0) &gt; 3 THEN 3*365*24*60*60 '
+ ' ELSE ISNULL(ABS(DATEDIFF(second, s.DBLastModifiedDateTime, s.RaisedDateTime)), 0) '
+ ' END '
+ ' ,s.DBLastModifiedDateTime'
+ ' ,s.DBLastModifiedByUserId'
+ ' FROM #ResolutionState r'
+ ' JOIN Alert.AlertStage2Process s ON (r.AlertStageRowId = s.AlertStageRowId)'
+ ' WHERE (s.ResolutionState &lt;&gt; r.LastResolutionState) OR (r.LastResolutionState IS NULL)'
EXECUTE (@Statement)

-- update all "time in state" columns since
-- we've added some state transitions potentially "in the middle"
SET @Statement =
'UPDATE ars'
+ ' SET TimeInStateSeconds = ISNULL(ABS(DATEDIFF(second, ars.StateSetDateTime, ars2.StateSetDateTime)), -1)'
+ ' FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertResolutionState_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' ars'
+ ' JOIN ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertResolutionState_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' ars2'
+ ' ON (ars.AlertGuid = ars2.AlertGuid)'
+ ' JOIN (SELECT DISTINCT AlertGuid = s.AlertGuid'
+ ' FROM #ResolutionState r'
+ ' JOIN Alert.AlertStage2Process s ON (r.AlertStageRowId = s.AlertStageRowId)'
+ ' WHERE (s.ResolutionState &lt;&gt; r.LastResolutionState) OR (r.LastResolutionState IS NULL)'
+ ' ) AS al ON (ars.AlertGuid = al.AlertGuid)'
+ ' WHERE (ars2.AlertResolutionStateRowId = (SELECT TOP 1 AlertResolutionStateRowId'
+ ' FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertResolutionState_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', ''))
+ ' WHERE (AlertGuid = ars.AlertGuid)'
+ ' AND (StateSetDateTime &gt;= ars.StateSetDateTime)'
+ ' AND (AlertResolutionStateRowId &lt;&gt; ars.AlertResolutionStateRowId)'
+ ' ORDER BY StateSetDateTime, ResolutionState DESC'
+ ' ))'
EXECUTE (@Statement)

DROP TABLE #ResolutionState

-- check to see if alert properties were updated
CREATE TABLE #AlertDetail (
AlertStageRowId int NOT NULL
,DetailRecordExistedInd bit NOT NULL
,Owner nvarchar(256) NULL
,TicketId nvarchar(256) NULL
,CustomField1 nvarchar(256) NULL
,CustomField2 nvarchar(256) NULL
,CustomField3 nvarchar(256) NULL
,CustomField4 nvarchar(256) NULL
,CustomField5 nvarchar(256) NULL
,CustomField6 nvarchar(256) NULL
,CustomField7 nvarchar(256) NULL
,CustomField8 nvarchar(256) NULL
,CustomField9 nvarchar(256) NULL
,CustomField10 nvarchar(256) NULL
,TfsWorkItemId nvarchar(256) NULL
,TfsWorkItemOwner nvarchar(256) NULL
)

SET @Statement =
'INSERT #AlertDetail ('
+ ' AlertStageRowId'
+ ' ,DetailRecordExistedInd'
+ ' ,Owner'
+ ' ,TicketId'
+ ' ,CustomField1'
+ ' ,CustomField2'
+ ' ,CustomField3'
+ ' ,CustomField4'
+ ' ,CustomField5'
+ ' ,CustomField6'
+ ' ,CustomField7'
+ ' ,CustomField8'
+ ' ,CustomField9'
+ ' ,CustomField10'
+ ' ,TfsWorkItemId'
+ ' ,TfsWorkItemOwner'
+ ')'
+ ' SELECT'
+ ' s.AlertStageRowId'
+ ' ,CASE WHEN d.AlertGuid IS NULL THEN 0 ELSE 1 END'
+ ' ,d.Owner'
+ ' ,d.TicketId'
+ ' ,d.CustomField1'
+ ' ,d.CustomField2'
+ ' ,d.CustomField3'
+ ' ,d.CustomField4'
+ ' ,d.CustomField5'
+ ' ,d.CustomField6'
+ ' ,d.CustomField7'
+ ' ,d.CustomField8'
+ ' ,d.CustomField9'
+ ' ,d.CustomField10'
+ ' ,d.TfsWorkItemId'
+ ' ,d.TfsWorkItemOwner'
+ ' FROM Alert.AlertStage2Process s'
+ ' LEFT JOIN ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertDetail_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' d ON (s.AlertGuid = d.AlertGuid)'
+ ' WHERE (s.AlertRowId IS NOT NULL)'
+ ' AND (s.TableGuid = ''' + CAST(@TableGuid AS varchar(50)) + ''')'
+ ' AND (NOT EXISTS (SELECT * FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertDetail_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' WHERE (AlertGuid = s.AlertGuid) AND (DBLastModifiedDateTime &lt;= s.DBLastModifiedDateTime) AND (AlertDetailRowId &gt; d.AlertDetailRowId)))'
EXECUTE (@Statement)

-- insert alert detail changes
SET @Statement =
'INSERT ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME('AlertDetail_' + REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')) + ' ('
+ ' AlertGuid'
+ ' ,Owner'
+ ' ,TicketId'
+ ' ,CustomField1'
+ ' ,CustomField2'
+ ' ,CustomField3'
+ ' ,CustomField4'
+ ' ,CustomField5'
+ ' ,CustomField6'
+ ' ,CustomField7'
+ ' ,CustomField8'
+ ' ,CustomField9'
+ ' ,CustomField10'
+ ' ,DBLastModifiedDateTime'
+ ' ,DBLastModifiedByUserId'
+ ' ,TfsWorkItemId'
+ ' ,TfsWorkItemOwner'
+ ' )'
+ ' SELECT'
+ ' s.AlertGuid'
+ ' ,s.Owner'
+ ' ,s.TicketId'
+ ' ,s.CustomField1'
+ ' ,s.CustomField2'
+ ' ,s.CustomField3'
+ ' ,s.CustomField4'
+ ' ,s.CustomField5'
+ ' ,s.CustomField6'
+ ' ,s.CustomField7'
+ ' ,s.CustomField8'
+ ' ,s.CustomField9'
+ ' ,s.CustomField10'
+ ' ,s.DBLastModifiedDateTime'
+ ' ,s.DBLastModifiedByUserId'
+ ' ,s.TfsWorkItemId'
+ ' ,s.TfsWorkItemOwner'
+ ' FROM #AlertDetail d'
+ ' JOIN Alert.AlertStage2Process s ON (d.AlertStageRowId = s.AlertStageRowId)'
+ ' WHERE (ISNULL(s.Owner, '''') &lt;&gt; ISNULL(d.Owner, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.TicketId, '''') &lt;&gt; ISNULL(d.TicketId, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField1, '''') &lt;&gt; ISNULL(d.CustomField1, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField2, '''') &lt;&gt; ISNULL(d.CustomField2, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField3, '''') &lt;&gt; ISNULL(d.CustomField3, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField4, '''') &lt;&gt; ISNULL(d.CustomField4, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField5, '''') &lt;&gt; ISNULL(d.CustomField5, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField6, '''') &lt;&gt; ISNULL(d.CustomField6, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField7, '''') &lt;&gt; ISNULL(d.CustomField7, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField8, '''') &lt;&gt; ISNULL(d.CustomField8, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField9, '''') &lt;&gt; ISNULL(d.CustomField9, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.CustomField10, '''') &lt;&gt; ISNULL(d.CustomField10, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.TfsWorkItemId, '''') &lt;&gt; ISNULL(d.TfsWorkItemId, '''') COLLATE database_default)'
+ ' OR (ISNULL(s.TfsWorkItemOwner, '''') &lt;&gt; ISNULL(d.TfsWorkItemOwner, '''') COLLATE database_default)'
+ ' OR (d.DetailRecordExistedInd = 0)'
EXECUTE (@Statement)

DROP TABLE #AlertDetail

-- mark affected table as non-optimized
UPDATE StandardDatasetTableMap
SET OptimizedInd = 0
WHERE (DatasetId = @DatasetId)
AND (AggregationTypeId = 0)
AND (TableGuid = @TableGuid)
AND (InsertInd = 0)
END
END

TRUNCATE TABLE Alert.AlertStage2Process

IF (@DebugLevel &gt; 3)
BEGIN
SET @MessageText = 'Finished inserting alert(s) into ' + @InsertTableName
SET @OperationDurationMs = ABS(DATEDIFF(ms, GETUTCDATE(), @InsertStartedDateTime))

EXEC DebugMessageInsert
@DatasetId = @DatasetId
,@MessageLevel = 4
,@MessageText = @MessageText
,@OperationDurationMs = @OperationDurationMs
END

COMMIT
END TRY
BEGIN CATCH
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()

SET @ErrorInd = 1
END CATCH

-- report error if any
IF (@ErrorInd = 1)
BEGIN
IF (@DebugLevel &gt; 0)
BEGIN
DECLARE @DebugMessageText nvarchar(max)

SET @DebugMessageText = N'Failed to process alert staging area. Error ' + CAST(@ErrorNumber AS varchar(15))
+ ', Procedure ' + @ErrorProcedure
+ ', Line ' + CAST(@ErrorLine AS varchar(15))
+ ', Message: '+ @ErrorMessageText

EXEC DebugMessageInsert
@DatasetId = @DatasetId
,@MessageLevel = 1
,@MessageText = @DebugMessageText
END

DECLARE @AdjustedErrorSeverity int

SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity &gt; 18 THEN 18
ELSE @ErrorSeverity
END

RAISERROR (777971002, @AdjustedErrorSeverity, 1
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END
END
GO

</Upgrade>
</DataWarehouseDataSet>