
[dbo].[CleanOrphanedSnapshots]
CREATE PROCEDURE [dbo].[CleanOrphanedSnapshots]
@Machine nvarchar(512),
@SnapshotsCleaned int OUTPUT,
@ChunksCleaned int OUTPUT,
@TempSnapshotID uniqueidentifier OUTPUT
AS
SET DEADLOCK_PRIORITY LOW
CREATE TABLE #tempSnapshot (SnapshotDataID uniqueidentifier)
INSERT INTO #tempSnapshot SELECT TOP 1 SnapshotDataID
FROM SnapshotData WITH (NOLOCK)
where SnapshotData.PermanentRefcount = 0
AND SnapshotData.TransientRefcount = 0
SET @SnapshotsCleaned = @@ROWCOUNT
DELETE ChunkData FROM ChunkData INNER JOIN #tempSnapshot
ON ChunkData.SnapshotDataID = #tempSnapshot.SnapshotDataID
SET @ChunksCleaned = @@ROWCOUNT
DELETE SnapshotData FROM SnapshotData INNER JOIN #tempSnapshot
ON SnapshotData.SnapshotDataID = #tempSnapshot.SnapshotDataID
TRUNCATE TABLE #tempSnapshot
INSERT INTO #tempSnapshot SELECT TOP 1 SnapshotDataID
FROM [ReportServerTempDB].dbo.SnapshotData WITH (NOLOCK)
where [ReportServerTempDB].dbo.SnapshotData.PermanentRefcount = 0
AND [ReportServerTempDB].dbo.SnapshotData.TransientRefcount = 0
AND [ReportServerTempDB].dbo.SnapshotData.Machine = @Machine
SET @SnapshotsCleaned = @SnapshotsCleaned + @@ROWCOUNT
SELECT @TempSnapshotID = (SELECT SnapshotDataID FROM #tempSnapshot)
DELETE [ReportServerTempDB].dbo.ChunkData FROM [ReportServerTempDB].dbo.ChunkData INNER JOIN #tempSnapshot
ON [ReportServerTempDB].dbo.ChunkData.SnapshotDataID = #tempSnapshot.SnapshotDataID
SET @ChunksCleaned = @ChunksCleaned + @@ROWCOUNT
DELETE [ReportServerTempDB].dbo.SnapshotData FROM [ReportServerTempDB].dbo.SnapshotData INNER JOIN #tempSnapshot
ON [ReportServerTempDB].dbo.SnapshotData.SnapshotDataID = #tempSnapshot.SnapshotDataID
GO
GRANT EXECUTE ON [dbo].[CleanOrphanedSnapshots] TO [RSExecRole]
GO