SET NOCOUNT ON
DECLARE @DBNAME VARCHAR(36),@CMD VARCHAR(255),@CMD2 VARCHAR(255),@CMD3 VARCHAR(255),@I INT, @J INT,@Y INT, @X INT,@GP INT
—TABELA TEMPORARIA PARA ARMAZENAR OS BANCOS DE DADOS
CREATE TABLE #TEMP (ID INT IDENTITY, DBNAME SYSNAME)
INSERT INTO #TEMP
SELECT DB.NAME FROM MASTER..SYSDATABASES DB
WHERE DB.NAME NOT IN(‘TEMPDB’ ,’MASTER’,’MODEL’,’MSDB’)
ORDER BY DB.NAME
SELECT @I = 1
SELECT @J = MAX(ID) FROM #TEMP
WHILE @I <= @J
BEGIN
SELECT @DBNAME = DBNAME FROM #TEMP WHERE @I = ID
SELECT @CMD = NULL
–TABELA TEMPORARIA PARA ARMAZENAR OS DATATFILES
CREATE TABLE #TEMP2 (ID INT IDENTITY,CMD VARCHAR(100),GROUPID INT)
SELECT @CMD =’USE ‘+@DBNAME+’ INSERT INTO #TEMP2 SELECT ”DBCC SHRINKFILE(”+RTRIM(NAME)+”,1)”,GROUPID FROM SYSFILES ORDER BY 1′
EXEC (@CMD)
SELECT @Y=1
SELECT @X=MAX(ID) FROM #TEMP2
WHILE @Y<=@X
BEGIN
SELECT @CMD2=CMD,@GP=GROUPID FROM #TEMP2 WHERE @Y=ID
SELECT @CMD3=NULL
IF (@GP=0)
BEGIN
SELECT @CMD3=’USE ‘+@DBNAME+’ BACKUP LOG ‘+@DBNAME+’ WITH TRUNCATE_ONLY’
–PRINT(@CMD3)
EXEC(@CMD3)
END
— PRINT(‘USE ‘+@DBNAME+’ ‘+@CMD2)
EXEC(‘USE ‘+@DBNAME+’ ‘+@CMD2)
SELECT @Y=@Y+1
END
DROP TABLE #TEMP2
SELECT @I = @I +1
END
DROP TABLE #TEMP
Nota1: É importante observar que este script executa um SHRINK em todas as bases de dados (exceto as bases de sistema). Para saber como executar um SHRINK em apenas uma base, leia a dica Procedure para diminuir o tamanho da base
Nota2: Para quem pretende executar um SHRINK no database TEMPDB, o processo é um pouco diferente, mais informações podem ser obtidas no KB307487: How to shrink the tempdb database in SQL Server

