DECLARE @ObjectName sysname = 'VIEW_NAME'; DECLARE @ObjectSchema sysname = 'dbo'; DECLARE @WithFullscan BIT = 1; DECLARE @ExecuteUpdateStatistics BIT = 1; ---------------CODE SET NOCOUNT ON; IF NOT EXISTS ( SELECT * FROM sys.objects WHERE name = @ObjectName AND schema_id = SCHEMA_ID(@ObjectSchema) AND type = 'V' ) THROW 50000, 'Obiekt nie istnieje lub nie jest widokiem!', 1; DECLARE @ObjectsToProcess TABLE ( id INT IDENTITY PRIMARY KEY , oschema sysname , oname sysname , otype CHAR(2) , AddedFrom NVARCHAR(MAX) NULL ); WITH ObjectsToProcess AS ( SELECT * FROM sys.dm_sql_referenced_entities( QUOTENAME(@ObjectSchema) + '.' + QUOTENAME(@ObjectName) , 'OBJECT' ) ) INSERT INTO @ObjectsToProcess ( oschema , oname , otype ) SELECT DISTINCT oschema = ISNULL(tp.referenced_schema_name, 'dbo') , oname = tp.referenced_entity_name , otype = o.type FROM ObjectsToProcess tp JOIN sys.objects o ON tp.referenced_id = o.object_id; DECLARE @ViewsToExpand TABLE ( id INT IDENTITY PRIMARY KEY , vschema sysname , vname sysname , Processed BIT DEFAULT 0 ); DELETE FROM @ObjectsToProcess OUTPUT Deleted.oschema , Deleted.oname INTO @ViewsToExpand ( vschema , vname ) WHERE otype = 'V'; DECLARE @CurrId INT , @CurrVFullName NVARCHAR(MAX); DECLARE @NestedObjectsToProcess TABLE ( id INT IDENTITY PRIMARY KEY , oschema sysname , oname sysname , otype CHAR(2) ); WHILE EXISTS ( SELECT TOP 1 1 FROM @ViewsToExpand WHERE Processed = 0 ) BEGIN SELECT TOP 1 @CurrId = id , @CurrVFullName = QUOTENAME(vschema) + '.' + QUOTENAME(vname) FROM @ViewsToExpand WHERE Processed = 0; WITH NestedObjectsToProcess AS ( SELECT * FROM sys.dm_sql_referenced_entities(@CurrVFullName, 'OBJECT') ) INSERT INTO @NestedObjectsToProcess ( oschema , oname , otype ) SELECT DISTINCT oschema = ISNULL( tp.referenced_schema_name , 'dbo' ) , oname = tp.referenced_entity_name , otype = o.type FROM NestedObjectsToProcess tp JOIN sys.objects o ON tp.referenced_id = o.object_id; INSERT INTO @ViewsToExpand ( vschema , vname ) SELECT oschema , oname FROM @NestedObjectsToProcess tp LEFT JOIN @ViewsToExpand vte ON tp.oschema = vte.vschema AND tp.oname = vte.vname WHERE tp.otype = 'V' AND vte.id IS NULL; INSERT INTO @ObjectsToProcess ( oschema , oname , otype , AddedFrom ) SELECT ntp.oschema , ntp.oname , ntp.otype , @CurrVFullName FROM @NestedObjectsToProcess ntp LEFT JOIN @ObjectsToProcess otp ON otp.oname = ntp.oname AND otp.oschema = ntp.oschema WHERE ntp.otype != 'V' AND otp.id IS NULL; UPDATE @ViewsToExpand SET Processed = 1 WHERE id = @CurrId; END; /* SEKCJA PODSUMOWANIA */ DECLARE @msg NVARCHAR(MAX) , @txt NVARCHAR(MAX); DECLARE @SCRollDog CURSOR; IF EXISTS ( SELECT TOP 1 1 FROM @ViewsToExpand ) BEGIN SET @msg = 'Znaleziono odniesienia do następujących widoków:'; RAISERROR(@msg, 0, 1) WITH NOWAIT; SET @SCRollDog = CURSOR LOCAL FAST_FORWARD FOR SELECT txt = QUOTENAME(vschema) + '.' + QUOTENAME(vname) FROM @ViewsToExpand; OPEN @SCRollDog; FETCH NEXT FROM @SCRollDog INTO @txt; WHILE @@FETCH_STATUS = 0 BEGIN SET @msg = ' --> ' + @txt; RAISERROR(@msg, 0, 1) WITH NOWAIT; FETCH NEXT FROM @SCRollDog INTO @txt; END; CLOSE @SCRollDog; DEALLOCATE @SCRollDog; END; --odstep SET @msg = CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10); RAISERROR(@msg, 0, 1) WITH NOWAIT; SET @msg = 'Tabele do aktualizacji statystyk:'; RAISERROR(@msg, 0, 1) WITH NOWAIT; SET @SCRollDog = CURSOR LOCAL FAST_FORWARD FOR SELECT txt = QUOTENAME(oschema) + '.' + QUOTENAME(oname) + CASE WHEN AddedFrom IS NOT NULL THEN ' (wymagana przez widok: ' + AddedFrom + ')' ELSE '' END FROM @ObjectsToProcess; OPEN @SCRollDog; FETCH NEXT FROM @SCRollDog INTO @txt; WHILE @@FETCH_STATUS = 0 BEGIN SET @msg = ' --> ' + @txt; RAISERROR(@msg, 0, 1) WITH NOWAIT; FETCH NEXT FROM @SCRollDog INTO @txt; END; CLOSE @SCRollDog; DEALLOCATE @SCRollDog; SET @msg = CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10); RAISERROR(@msg, 0, 1) WITH NOWAIT; IF @ExecuteUpdateStatistics = 0 BEGIN SET @msg = 'Skrypt aktualizujący statystyki:'; RAISERROR(@msg, 0, 1) WITH NOWAIT; SET @msg = CHAR(13) + CHAR(10); RAISERROR(@msg, 0, 1) WITH NOWAIT; SET @SCRollDog = CURSOR LOCAL FAST_FORWARD FOR SELECT txt = 'UPDATE STATISTICS ' + QUOTENAME(oschema) + '.' + QUOTENAME(oname) + CASE WHEN @WithFullscan = 1 THEN ' WITH FULLSCAN' ELSE '' END FROM @ObjectsToProcess; OPEN @SCRollDog; FETCH NEXT FROM @SCRollDog INTO @txt; WHILE @@FETCH_STATUS = 0 BEGIN RAISERROR(@txt, 0, 1) WITH NOWAIT; FETCH NEXT FROM @SCRollDog INTO @txt; END; CLOSE @SCRollDog; DEALLOCATE @SCRollDog; SET @msg = CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10); RAISERROR(@msg, 0, 1) WITH NOWAIT; END; ELSE --IF @ExecuteUpdateStatistics = 1 BEGIN DECLARE @ObjCount_s NVARCHAR(MAX) = ( SELECT CAST(COUNT(*) AS NVARCHAR(MAX)) FROM @ObjectsToProcess ) , @i INT = 1; DECLARE @DateTimeStart DATETIME2(0) , @DateTimeStop DATETIME2(0) , @TotalDateTimeStart DATETIME2(0) = GETDATE() , @TotalDateTimeStop DATETIME2(0); DECLARE @CurrObject NVARCHAR(MAX); SET @SCRollDog = CURSOR LOCAL FAST_FORWARD FOR SELECT txt = 'UPDATE STATISTICS ' + QUOTENAME(oschema) + '.' + QUOTENAME(oname) + CASE WHEN @WithFullscan = 1 THEN ' WITH FULLSCAN' ELSE '' END , CurrObject = QUOTENAME(oschema) + '.' + QUOTENAME(oname) FROM @ObjectsToProcess; OPEN @SCRollDog; FETCH NEXT FROM @SCRollDog INTO @txt , @CurrObject; WHILE @@FETCH_STATUS = 0 BEGIN SET @DateTimeStart = GETDATE(); SET @msg = 'Processing: ' + @CurrObject + ' (' + CAST(@i AS NVARCHAR(MAX)) + '/' + @ObjCount_s + ') , start: ' + CAST(@DateTimeStart AS NVARCHAR(MAX)); RAISERROR(@msg, 0, 1) WITH NOWAIT; EXEC ( @txt ); SET @DateTimeStop = GETDATE(); SET @msg = 'Processing: ' + @CurrObject + ' DONE in: ' + CONVERT( NVARCHAR , DATEADD( ss , DATEDIFF( ss , @DateTimeStart , @DateTimeStop ) , 0 ) , 108 ) + ' , stop: ' + CAST(@DateTimeStop AS NVARCHAR(MAX)); RAISERROR(@msg, 0, 1) WITH NOWAIT; RAISERROR('', 0, 1) WITH NOWAIT; FETCH NEXT FROM @SCRollDog INTO @txt , @CurrObject; SET @i += 1; END; CLOSE @SCRollDog; DEALLOCATE @SCRollDog; SET @TotalDateTimeStop = GETDATE(); SET @msg = CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10); RAISERROR(@msg, 0, 1) WITH NOWAIT; SET @msg = 'PROCESSING DONE! Total time: ' + CONVERT( NVARCHAR , DATEADD( ss , DATEDIFF( ss , @TotalDateTimeStart , @TotalDateTimeStop ) , 0 ) , 108 ); RAISERROR(@msg, 0, 1) WITH NOWAIT; END;