In SQL Server 2005, a shrink operation (DBCC SHRINKFILE) tries to shrink the specified transaction log file to the requested size immediately. To shrink the transaction log file manually under the full recovery model, first back up the transaction log file. Then, use the DBCC SHRINKFILE statement to shrink the transaction log file.

Typically, shrinking the transaction log file in SQL Server 2005 is faster than shrinking the transaction log file in SQL Server 2000. The reason is that the SQL Server 2005 log manager creates or reuses inactive virtual log files by following the physical disk storage order. Therefore, the inactive part of the transaction log file is usually at the end of the file.

For example, the transaction log file may have 100 virtual log files, and only 2 virtual log files are used. SQL Server 2000 may store the first used virtual log file at the start of the transaction log file and the second used virtual log file in the middle of the transaction log file. To shrink the transaction log file to only 2 virtual log files, SQL Server fills the remaining part of the second virtual log file by using dummy log entries. SQL Server moves the start of the logical log to the next available virtual log file that is specified by the log manager. The log manager may create a virtual log file in the middle of the transaction log file just ahead of the last active virtual log file. In that case, you have to use multiple log backup operations and multiple shrink operations to successfully shrink the transaction log file to 2 virtual log files. In the worst case of this example, you may have to use 50 log backup operations and 50 shrink operations to successfully shrink the transaction log file to 2 virtual log files.

However, in SQL Server 2005, you can perform one DBCC SHRINKFILE statement to shrink the transaction log file immediately to 2 virtual log files. You can do this because the SQL Server 2005 log manager creates 2 virtual log files by following the physical disk storage order. Both of these virtual log files are at the start of the transaction log file.

alter database mydatabase set recovery simple;
dbcc shrinkfile (
mydatabase_log,1);
alter database
mydatabase set recovery full;

Run on all databases

begin
  declare @dbname varchar(50)
  declare @logname varchar(50)
  declare @sql varchar(2000)
  declare cDB cursor for select name from sys.databases
  open cDB
  fetch next from cDB into @dbname
  while @@fetch_status=0
    begin
      exec ('use ['+@dbname+']')
      exec ('sp_MSForEachTable @command1="dbcc dbreindex (''?'')"')
      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)
        exec ('alter database ['+@dbname+'] set recovery full')
      end try begin catch end catch
      fetch next from cDB into @dbname
    end
  close cDB
  deallocate cDB
end  

via: http://support.microsoft.com/kb/907511