Sometimes, you just want things brutally simple and stupid. I was searching for how to do this, and stumbled upon this post on SQL Server Central.
Turns out the query listed there doesn’t handle databases with weird names, containing version numbers with “.” in them, for instance.
Thus, I modified it slightly, adding brackets and such, and came up with the following:
USE MASTER
DECLARE
@isql varchar(2000),
@dbname varchar(64),
@logfile varchar(128)
DECLARE c1 CURSOR FOR
SELECT d.name, mf.name as logfile--, physical_name AS current_file_location, size
FROM sys.master_files mf
INNER JOIN sys.databases d
ON mf.database_id = d.database_id
WHERE recovery_model_desc <> 'SIMPLE'
AND d.name NOT IN ('master','model','msdb','tempdb')
AND mf.type_desc = 'LOG'
OPEN c1
FETCH NEXT FROM c1 INTO @dbname, @logfile
WHILE @@fetch_status <> -1
BEGIN
SELECT @isql = 'ALTER DATABASE [' + @dbname + '] SET RECOVERY SIMPLE'
PRINT @isql
--EXEC(@isql)
SELECT @isql='USE [' + @dbname + '] checkpoint'
PRINT @isql
--EXEC(@isql)
SELECT @isql='USE [' + @dbname + '] DBCC SHRINKFILE ([' + @logfile + '], 0)'
PRINT @isql
--EXEC(@isql)
FETCH NEXT FROM c1 INTO @dbname, @logfile
END
CLOSE c1
DEALLOCATE c1
NOTE: The “EXEC()” statements are commented out, so you can inspect what’s going to happen before adding them back in.