USE [master]
GO

/****** Object:  StoredProcedure [dbo].[spShrinkAllDatabases]    Script Date: 08/12/2011 15:40:15 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:             Dan Sutton
-- Create date: 06/14/2011
-- Description:      Reindex all tables and shrink Logs and Data Files in Server
-- =============================================
CREATE PROCEDURE [dbo].[spShrinkAllDatabases]
AS
BEGIN
       SET NOCOUNT ON;
  DECLARE @dbname VARCHAR(50)
  DECLARE @logname VARCHAR(50)
  DECLARE @sql VARCHAR(2000)
  DECLARE @TableName varchar(255)

  DECLARE cDB CURSOR FOR SELECT name FROM sys.databases
  OPEN cDB
  FETCH NEXT FROM cDB INTO @dbname
  WHILE @@FETCH_STATUS=0
    BEGIN
      PRINT ('Shrinking Database '+@dbname+' ...')
      BEGIN TRY
        EXEC ('ALTER DATABASE ['+@dbname+'] SET RECOVERY SIMPLE')
        DECLARE cLog CURSOR FOR SELECT name FROM sys.database_files WHERE type_desc='LOG'
        OPEN cLog
        FETCH NEXT FROM cLog INTO @logname
        WHILE @@FETCH_STATUS=0
          BEGIN
            BEGIN TRY
              DBCC SHRINKFILE (@logname,0)
            END TRY BEGIN CATCH END CATCH
            FETCH NEXT FROM cLog INTO @logname
          END
        CLOSE cLog
        DEALLOCATE cLog
        DBCC SHRINKDATABASE (@dbname, TRUNCATEONLY)
      END TRY
      BEGIN CATCH
        PRINT ('- Shrink Failed')
      END CATCH
      BEGIN TRY
        EXEC ('ALTER DATABASE ['+@dbname+'] SET RECOVERY FULL')
      END TRY BEGIN CATCH END CATCH

      -- Now rebuild all the indexes in the database
      create table #temp_reindex(TableName varchar(255))
      EXEC ('INSERT INTO #temp_reindex'
        +' SELECT ''['+@dbname+'].[''+OBJECT_SCHEMA_NAME([OBJECT_ID],DB_ID('''+@dbname+'''))+''].[''+name+'']'''
        +' FROM ['+@dbname+'].sys.tables')
      DECLARE tb CURSOR LOCAL FOR SELECT TableName from #temp_reindex
      OPEN tb
      FETCH NEXT FROM tb INTO @TableName
      WHILE @@FETCH_STATUS=0
        BEGIN
          PRINT ('Rebuilding Indexes for '+@TableName+' ...')
          BEGIN TRY
            EXEC ('ALTER INDEX ALL ON '+@TableName+' REBUILD WITH (FILLFACTOR=80)')
          END TRY
          BEGIN CATCH
            PRINT ('- Reindex Failed')
          END CATCH
          FETCH NEXT FROM tb INTO @TableName
        END
      CLOSE tb
      DEALLOCATE tb
      DROP TABLE #temp_reindex

      FETCH NEXT FROM cDB INTO @dbname
    END
  CLOSE cDB
  DEALLOCATE cDB
END    

GO