DECLARE
@ErrorInd bit
,@ErrorMessageText nvarchar(4000)
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)
SET @ErrorInd = 0
IF NOT EXISTS (SELECT * FROM StandardDataset WHERE DatasetId = '$Config/DatasetId$')
BEGIN TRY
INSERT INTO StandardDataset (
DatasetId
,SchemaName
,DefaultAggregationIntervalCount
,RawInsertTableCount
,StagingProcessorStoredProcedureName
,BlockingMaintenanceDailyStartTime
,BlockingMaintenanceDurationMinutes
)
VALUES
(
'$Config/DatasetId$'
,'FS'
,$Config/DefaultAggregationIntervalCount$
,$Config/RawInsertTableCount$
,'FS.DedupStatusProcessStaging'
,'$Config/BlockingMaintenanceDailyStartTime$'
,$Config/BlockingMaintenanceDurationMinutes$
)
END TRY
BEGIN CATCH
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
IF (@ErrorInd = 1)
BEGIN
DECLARE @AdjustedErrorSeverity int
SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity > 18 THEN 18
ELSE @ErrorSeverity
END
RAISERROR (777971001, @AdjustedErrorSeverity, 1
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END
GO
--------------------------------------------------------------------------------------
-- Create the StandardDatasetAggregation entries
--------------------------------------------------------------------------------------
SET NOCOUNT ON
DECLARE
@ErrorInd bit
,@ErrorMessageText nvarchar(4000)
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)
SET @ErrorInd = 0
DECLARE
@ExecResult int
,@XmlDocHandle int
,@XmlDocText nvarchar(max)
IF NOT EXISTS (SELECT * FROM StandardDatasetAggregation WHERE DatasetId = '$Config/DatasetId$')
BEGIN TRY
SET @XmlDocText = '<Aggregations>$Config/Aggregations$</Aggregations>'
INSERT StandardDatasetAggregation
(
DatasetId
,AggregationTypeId
,AggregationIntervalDurationMinutes
,AggregationStartDelayMinutes
,BuildAggregationStoredProcedureName
,DeleteAggregationStoredProcedureName
,GroomStoredProcedureName
,IndexOptimizationIntervalMinutes
,MaxDataAgeDays
,GroomingIntervalMinutes
,MaxRowsToGroom
,LastGroomingDateTime
,DataFileGroupName
,IndexFileGroupName
)
SELECT
'$Config/DatasetId$'
,CASE AggregationType
WHEN 'Raw' THEN 0
WHEN 'Hourly' THEN 20
WHEN 'Daily' THEN 30
END
,CASE AggregationType
WHEN 'Raw' THEN 0
WHEN 'Hourly' THEN 60
WHEN 'Daily' THEN 60*24
END
,CASE AggregationType
WHEN 'Raw' THEN 1
WHEN 'Hourly' THEN 60
WHEN 'Daily' THEN 60*24
END
,CASE AggregationType
WHEN 'Raw' THEN NULL
ELSE 'FS.DedupStatusAggregate'
END
,
CASE AggregationType
WHEN 'Raw' THEN NULL
ELSE 'FS.DedupStatusAggregationDelete'
END
,'FS.DedupStatusGroom'
,IndexOptimizationIntervalMinutes
,MaxDataAgeDays
,GroomingIntervalMinutes
,MaxRowsToGroom
,GETUTCDATE()
,DataFileGroupName
,IndexFileGroupName
FROM OPENXML(@XmlDocHandle, 'Aggregations/*', 2) WITH (
AggregationType varchar(50) '@mp:localname'
,MaxTableRowCount int
,MaxTableSizeKb int
,AggregationStartDelayMinutes int
,MaxDataAgeDays int
,GroomingIntervalMinutes int
,MaxRowsToGroom int
,IndexOptimizationIntervalMinutes int
,DataFileGroupName nvarchar(256)
,IndexFileGroupName nvarchar(256)
,AggregationIntervalDurationMinutes int
)
END TRY
BEGIN CATCH
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
IF (@XmlDocHandle IS NOT NULL)
EXEC sp_xml_removedocument @XmlDocHandle
IF (@ErrorInd = 1)
BEGIN
DECLARE @AdjustedErrorSeverity int
SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity > 18 THEN 18
ELSE @ErrorSeverity
END
RAISERROR (777971002, @AdjustedErrorSeverity, 1
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END
GO
--------------------------------------------------------------------------------------
-- Define the tables and views
--------------------------------------------------------------------------------------
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE [name] = 'FS')
BEGIN
EXECUTE('CREATE SCHEMA FS')
END
GO
-- change schema ownership to allow index rebuild and reorganize
ALTER AUTHORIZATION ON SCHEMA::FS TO OpsMgrWriter
GO
-- change schema alter to allow domain table index rebuild
GRANT ALTER ON SCHEMA::dbo TO OpsMgrWriter
GO
GRANT ALTER ON SCHEMA::FS TO OpsMgrWriter
GO
-- grant create table permissions
GRANT CREATE TABLE TO OpsMgrWriter
GO
SET NOCOUNT ON
DECLARE
@ErrorInd bit
,@ErrorMessageText nvarchar(4000)
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)
SET @ErrorInd = 0
DECLARE
@ExecResult int
,@XmlDocHandle int
,@XmlDocText nvarchar(max)
BEGIN TRY
-- Insert definition for FS.DedupStatusStaging table into StandardDatasetStagingArea.
BEGIN TRAN
IF EXISTS (SELECT * FROM StandardDatasetStagingArea WHERE DatasetId = '$Config/DatasetId$')
BEGIN
DELETE StandardDatasetStagingArea
WHERE DatasetId = '$Config/DatasetId$';
END
INSERT INTO StandardDatasetStagingArea
(
DatasetId
,StagingTableColumnDefinition
,MaxRowsToProcessPerTransactionCount
,BatchedProcessingSupportedInd
)
VALUES
(
'$Config/DatasetId$'
,
'DedupStatusRowId int NOT NULL IDENTITY(1, 1)
,ComputerName varchar(256)
,VolumeId varchar(256)
,Volume varchar(256)
,DaysSinceLastOptimization int
,DaysSinceLastGarbageCollection int
,DaysSinceLastScrubbing int
,OptimizedFilesCount bigint
,OptimizedFilesSize bigint
,InPolicyFilesCount bigint
,InPolicyFilesSize bigint
,DedupCompletionPercent float
,SavingsRate float
,SavedSpace bigint
,CreationTime datetime
'
-- This defines how many records does ProcessStaging sproc process per each execution (every 1 minute).
,10000 -- Value based on experience in Datacenter Production environment
,1
)
COMMIT
-- Create the FS.DedupStatusStaging table.
BEGIN TRAN
-- Drop table if it exists.
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusStaging]') AND type in (N'U'))
BEGIN
DROP TABLE [FS].[DedupStatusStaging];
END
IF (@XmlDocHandle IS NOT NULL)
EXEC sp_xml_removedocument @XmlDocHandle
IF (@ErrorInd = 1)
BEGIN
DECLARE @AdjustedErrorSeverity int
SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity > 18 THEN 18
ELSE @ErrorSeverity
END
RAISERROR (777971003, @AdjustedErrorSeverity, 1
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END
GO
--------------------------------------------------------------------------------------
-- Allocate standard storage for the dataset.
--------------------------------------------------------------------------------------
SET NOCOUNT ON
DECLARE
@ErrorInd bit
,@ErrorMessageText nvarchar(4000)
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)
SET @ErrorInd = 0
DECLARE
@ExecResult int
,@XmlDocHandle int
,@XmlDocText nvarchar(max)
BEGIN TRY
SET @XmlDocText = '<Aggregations>$Config/Aggregations$</Aggregations>'
WHILE EXISTS (SELECT *
FROM OPENXML(@XmlDocHandle, 'Aggregations/*', 2) WITH (
AggregationType varchar(50) '@mp:localname')
WHERE AggregationType > @AggregationType
)
BEGIN
SELECT TOP 1 @AggregationType = AggregationType
FROM OPENXML(@XmlDocHandle, 'Aggregations/*', 2) WITH (
AggregationType varchar(50) '@mp:localname')
WHERE AggregationType > @AggregationType
ORDER BY AggregationType
SET @Statement = 'EXEC StandardDatasetAllocateStorage @DatasetId = ''$Config/DatasetId$'', @AggregationTypeId='
+ CASE @AggregationType
WHEN 'Raw' THEN '0'
WHEN 'Hourly' THEN '20'
WHEN 'Daily' THEN '30'
END
EXECUTE (@Statement)
END
END TRY
BEGIN CATCH
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
IF (@XmlDocHandle IS NOT NULL)
EXEC sp_xml_removedocument @XmlDocHandle
IF (@ErrorInd = 1)
BEGIN
DECLARE @AdjustedErrorSeverity int
SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity > 18 THEN 18
ELSE @ErrorSeverity
END
RAISERROR (777971005, @AdjustedErrorSeverity, 1
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusProcessStaging]') AND type in (N'P'))
BEGIN
EXECUTE ('CREATE PROCEDURE [FS].[DedupStatusProcessStaging] AS RETURN 1')
END
GO
ALTER PROCEDURE [FS].[DedupStatusProcessStaging]
@DatasetId uniqueidentifier
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
-- Configuration variables.
-- Maximum age of data to keep in table DedupStatusStaging.
@MaxDataAgeDays int
-- Maximum number of rows to process per single run of this stored procedure.
,@MaxRowsToProcess int
-- Diagnostic variables.
,@DebugLevel int
,@DebugMessage nvarchar(4000)
,@OperationStartedDateTime datetime
,@OperationDurationMs bigint
,@RowsDeleted int
,@CountTotalProcessedRecords int
-- Number of records successfully processed and submitted into table.
,@CountSubmittedRecords int
-- Number of records for which there no match was found in Alert table.
,@CountSkippedRecords int
-- Number of records with invalid content in 'Context' column.
,@CountInvalidRecords int
BEGIN TRY
-- Get the debug level for dataset.
SELECT @DebugLevel = DebugLevel ,
@SchemaName = SchemaName
FROM dbo.StandardDataset WHERE DatasetId = @DatasetId;
EXEC dbo.StandardDatasetGetInsertTableGuid @DatasetId, 0, @TableGuid OUTPUT
SET @TableGuid = REPLACE(CAST(@TableGuid AS varchar(50)), '-', '')
SELECT @BaseTableName = BaseTableName
FROM StandardDatasetAggregationStorage
WHERE (DatasetId = @DatasetId)
AND (AggregationTypeId = 0)
AND (DependentTableInd = 0)
SET @InsertTableName = QUOTENAME(@SchemaName) + '.' + QUOTENAME(@BaseTableName + '_' + @TableGuid )
--
-- Groom the table DedupStatusStaging.
--
-- Get the grooming settings for table.
SELECT @MaxDataAgeDays = MaxDataAgeDays
FROM dbo.StandardDatasetAggregation WHERE DatasetId = @DatasetId AND AggregationTypeId = 0;
-- Delete the outdated records using the same grooming settings as for DedupStatusStaging table.
DELETE FROM FS.DedupStatusStaging WHERE [CreationTime] < DATEADD(day, - @MaxDataAgeDays, GETUTCDATE());
SET @RowsDeleted = @@ROWCOUNT;
IF((@DebugLevel > 2) AND (@RowsDeleted < 0))
-- Log a debug message.
BEGIN
SET @DebugMessage = 'Groomed table FS.DedupStatusStaging by ' + CAST(@RowsDeleted as varchar(16)) + ' records.';
EXEC DebugMessageInsert
@DatasetId = @DatasetId
,@MessageLevel = 3
,@MessageText = @DebugMessage
,@OperationDurationMs = @OperationDurationMs;
END
-- Log a debug message.
IF (@DebugLevel > 2)
BEGIN
SET @OperationStartedDateTime = GETDATE();
SET @OperationDurationMs = 0;
SET @DebugMessage = 'Started stage processing of FS.DedupStatusStaging table.';
--
-- Perform stage processing.
--
-- Get the configuration value for stage processing.
SELECT @MaxRowsToProcess = MaxRowsToProcessPerTransactionCount
FROM dbo.StandardDatasetStagingArea
WHERE DatasetId = @DatasetId;
if object_id('tempdb..#DedupStatusStagingBatch') is not null drop table #DedupStatusStagingBatch
CREATE TABLE #DedupStatusStagingBatch
(
DedupStatusRowId int
,ComputerName varchar(256)
,VolumeId varchar(256)
,Volume varchar(256)
,DaysSinceLastOptimization int
,DaysSinceLastGarbageCollection int
,DaysSinceLastScrubbing int
,OptimizedFilesCount bigint
,OptimizedFilesSize bigint
,InPolicyFilesCount bigint
,InPolicyFilesSize bigint
,DedupCompletionPercent float
,SavingsRate float
,SavedSpace bigint
,CreationTime datetime
);
BEGIN TRAN
-- Select only the earliest @MaxRowsToProcess records from DedupStatusStaging for processing.
-- This way the processing is balanced in order not to let this stored procedure to time out.
INSERT INTO #DedupStatusStagingBatch(
DedupStatusRowId
,ComputerName
,VolumeId
,Volume
,DaysSinceLastOptimization
,DaysSinceLastGarbageCollection
,DaysSinceLastScrubbing
,OptimizedFilesCount
,OptimizedFilesSize
,InPolicyFilesCount
,InPolicyFilesSize
,DedupCompletionPercent
,SavingsRate
,SavedSpace
,CreationTime
)
SELECT TOP (@MaxRowsToProcess)
DedupStatusRowId
,ComputerName
,VolumeId
,Volume
,DaysSinceLastOptimization
,DaysSinceLastGarbageCollection
,DaysSinceLastScrubbing
,OptimizedFilesCount
,OptimizedFilesSize
,InPolicyFilesCount
,InPolicyFilesSize
,DedupCompletionPercent
,SavingsRate
,SavedSpace
,CreationTime
FROM FS.DedupStatusStaging AS A
ORDER BY DedupStatusRowId;
SET @Statement = 'INSERT INTO [FS].DedupStatus_' + CAST(@TableGuid AS varchar(300)) +
'(
ComputerName
,VolumeId
,Volume
,DaysSinceLastOptimization
,DaysSinceLastGarbageCollection
,DaysSinceLastScrubbing
,OptimizedFilesCount
,OptimizedFilesSize
,InPolicyFilesCount
,InPolicyFilesSize
,DedupCompletionPercent
,SavingsRate
,SavedSpace
,CreationTime
)
SELECT
ComputerName
,VolumeId
,Volume
,DaysSinceLastOptimization
,DaysSinceLastGarbageCollection
,DaysSinceLastScrubbing
,OptimizedFilesCount
,OptimizedFilesSize
,InPolicyFilesCount
,InPolicyFilesSize
,DedupCompletionPercent
,SavingsRate
,SavedSpace
,CreationTime
FROM #DedupStatusStagingBatch B'
EXECUTE (@Statement)
DELETE FROM [FS].DedupStatusStaging
FROM [FS].DedupStatusStaging AS staging -- Second FROM clause is used for filtering the records to be deleted.
INNER JOIN #DedupStatusStagingBatch AS batch ON staging.DedupStatusRowId = batch.DedupStatusRowId
COMMIT TRAN
-- Drop the temporary table.
DROP TABLE #DedupStatusStagingBatch;
END TRY
BEGIN CATCH
IF (@@TRANCOUNT > 0)
ROLLBACK TRAN
GRANT EXECUTE ON [FS].[DedupStatusProcessStaging] TO OpsMgrWriter
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusAggregate]') AND type in (N'P'))
BEGIN
EXECUTE ('CREATE PROCEDURE [FS].[DedupStatusAggregate] AS RETURN 1')
END
GO
ALTER PROCEDURE FS.DedupStatusAggregate
@DatasetId uniqueidentifier
,@AggregationTypeId int -- aggregration type: e.g. 20 = hourly
,@InsertTableGuid varchar(256) -- GUID of the aggregation table
,@IntervalStartDateTime datetime
,@IntervalEndDateTime datetime
AS
BEGIN
SET NOCOUNT ON
return 1
GRANT EXECUTE ON [FS].[DedupStatusAggregate] TO OpsMgrWriter
END
GO
GRANT EXECUTE ON [FS].[DedupStatusAggregate] TO OpsMgrWriter
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusAggregationDelete]') AND type in (N'P'))
BEGIN
EXECUTE ('CREATE PROCEDURE [FS].[DedupStatusAggregationDelete] AS RETURN 1')
END
GO
ALTER PROCEDURE FS.DedupStatusAggregationDelete
@DatasetId uniqueidentifier
,@AggregationTypeId tinyint
,@TableGuid uniqueidentifier
,@AggregationDateTime datetime
,@RowsDeleted int OUTPUT
AS
BEGIN
SET NOCOUNT ON
return 1
RETURN @RowsDeleted
END
GO
GRANT EXECUTE ON [FS].[DedupStatusAggregationDelete] TO OpsMgrWriter
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusGroom]') AND type in (N'P'))
BEGIN
EXECUTE ('CREATE PROCEDURE [FS].[DedupStatusGroom] AS RETURN 1')
END
GO
ALTER PROCEDURE FS.DedupStatusGroom
@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)
-- report error if any
IF (@ErrorInd = 1)
BEGIN
IF (@DebugLevel > 0)
BEGIN
DECLARE @DebugMessageText nvarchar(max)
SET @DebugMessageText = N'Failed to groom data for DedupStatus data set. Error ' + CAST(@ErrorNumber AS varchar(15))
+ ', Procedure ' + @ErrorProcedure
+ ', Line ' + CAST(@ErrorLine AS varchar(15))
+ ', Message: '+ @ErrorMessageText
GRANT EXECUTE ON [FS].[DedupStatusGroom] TO OpsMgrWriter
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusInsert]') AND type in (N'P'))
BEGIN
EXECUTE ('CREATE PROCEDURE [FS].[DedupStatusInsert] AS RETURN 1')
END
GO
ALTER PROCEDURE FS.DedupStatusInsert
@ManagementGroupId uniqueidentifier
,@DatasetId uniqueidentifier
,@DataXml nvarchar(max)
AS
BEGIN
SET NOCOUNT ON
DECLARE @CheckExecResult int
,@ManagementGroupRowId int
-- get the management group
SELECT @ManagementGroupRowId = ManagementGroupRowId
FROM vManagementGroup
WHERE (ManagementGroupGuid = @ManagementGroupId) AND (WriterLoginName = SUSER_Name())
DECLARE
@CurentTime datetime
,@ErrorInd bit
,@ErrorMessage nvarchar(max)
,@ErrorNumber int
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int
,@ErrorProcedure nvarchar(256)
,@ErrorMessageText nvarchar(max)
,@ResultingState int
IF (@XmlDocHandle IS NOT NULL)
EXEC sp_xml_removedocument @XmlDocHandle
-- report error if any
IF (@ErrorInd = 1)
BEGIN
DECLARE @AdjustedErrorSeverity int
SET @AdjustedErrorSeverity = CASE
WHEN @ErrorSeverity > 18 THEN 18
ELSE @ErrorSeverity
END
RAISERROR (777971009, @AdjustedErrorSeverity, @ResultingState
,@ErrorNumber
,@ErrorSeverity
,@ErrorState
,@ErrorProcedure
,@ErrorLine
,@ErrorMessageText
)
END
END
GO
GRANT EXECUTE ON FS.DedupStatusInsert TO OpsMgrWriter
GO </Install> <Uninstall>
-- drop SPs
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusAggregate]') AND type in (N'P'))
BEGIN
EXECUTE ('DROP PROCEDURE [FS].[DedupStatusAggregate]')
END
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusAggregationDelete]') AND type in (N'P'))
BEGIN
EXECUTE ('DROP PROCEDURE [FS].[DedupStatusAggregationDelete]')
END
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusGroom]') AND type in (N'P'))
BEGIN
EXECUTE ('DROP PROCEDURE [FS].[DedupStatusGroom]')
END
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusInsert]') AND type in (N'P'))
BEGIN
EXECUTE ('DROP PROCEDURE [FS].[DedupStatusInsert]')
END
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[FS].[DedupStatusProcessStaging]') AND type in (N'P'))
BEGIN
EXECUTE ('DROP PROCEDURE [FS].[DedupStatusProcessStaging]')
END
-- delete std dataset related data
EXEC StandardDatasetDelete '$Config/DatasetId$'
GO </Uninstall>
<Upgrade/>
</DataWarehouseDataSet>