Скрипт сжатия всех баз MS SQL
Скрипт обходит все пользовательские базы и сжимает их.
Данный скрипт является SQL-запросом и содержит несколько действий, которые выполняются для каждой базы данных в текущем экземпляре SQL Server.
Использует каждую базу данных одну за другой.
Если база данных не является одной из системных баз данных (master, model, msdb, tempdb), то он продолжает выполнять скрипт.
Находит таблицы в базе данных, у которых не применена сжатие данных.
Создает временную таблицу #tmpTables для хранения имён таблиц без сжатия данных.
В цикле while выбирает имя таблицы из #tmpTables и выполняет операции перестроения таблицы и индексов на этой таблице с использованием сжатия страниц данных. Затем удаляет эту таблицу из временной таблицы.
Проверяет, были ли внесены изменения в базу данных. Если да, то выполняет операцию сжатия базы данных с помощью команды DBCC SHRINKDATABASE.
Удаляет временную таблицу и возвращает имя текущей базы данных.
Таким образом, данный скрипт выполняет сжатие данных таблиц и индексов для всех таблиц в каждой базе данных в экземпляре SQL Server, если они еще не сжаты. Он также сжимает базу данных, если были внесены изменения.
EXEC sp_MSforeachdb 'USE ?
IF NOT (''?'' = ''master'' OR ''?'' = ''model'' OR ''?'' = ''msdb'' OR ''?'' = ''tempdb'')
BEGIN
  SELECT DISTINCT
    [tables].name AS TName
  INTO #tmpTables
  FROM sys.tables [tables]
  LEFT JOIN sys.indexes [indexes]
  ON [tables].object_id = [indexes].object_id
  LEFT JOIN sys.partitions p
  ON [indexes].index_id = p.index_id
    AND [tables].object_id = p.object_id
  WHERE p.data_compression_desc = ''NONE''
  DECLARE @TName nvarchar(2000)
  DECLARE @DBModifyed int
  SET @DBModifyed = 0
  SELECT TOP 1 @TName = TName FROM #tmpTables
  WHILE @@ROWCOUNT != 0
  BEGIN
    EXEC (''ALTER TABLE '' + @TName + '' REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)'')
    EXEC (''ALTER INDEX ALL ON '' + @TName + '' REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)'')
    DELETE #tmpTables WHERE TName = @TName
    SET @DBModifyed = 1
    SELECT TOP 1 @TName = TName FROM #tmpTables
  END
  IF @DBModifyed = 1
  BEGIN
    DBCC SHRINKDATABASE(N''?'', 0)
  END
  DROP TABLE #tmpTables
  SELECT ''?''
END'