2010.3.5 13:09
2011.5.29更新:
declare @DbName nvarchar(max)
declare @RecoveryModel nvarchar(15)
declare currsor1 cursor for select name,recovery_model_desc from sys.databases where database_id>4
open currsor1
fetch next from currsor1 into @DbName,@RecoveryModel
while @@FETCH_STATUS=0
begin
print '--收缩事务日志文件:' + @DbName
declare @DbLog nvarchar(max)
declare @sql nvarchar(max)
set @sql=N'
--'+Convert(nvarchar(20),GETDATE())+':开始收缩数据库'+@DbName+'的日志文件;
declare @DbLog nvarchar(max);
USE ['+@DbName+'];
set @DbLog=(select name from sys.database_files where [type]=1);
--先把还原模式转为简单模式;
USE [master];
ALTER DATABASE ['+@DbName+'] SET RECOVERY SIMPLE WITH NO_WAIT;
ALTER DATABASE ['+@DbName+'] SET RECOVERY SIMPLE;
USE ['+@DbName+'];
exec (''DBCC SHRINKFILE ("''+@DbLog+''" , 0, TRUNCATEONLY)'');
--恢复以前数据库的还原模式;
USE [master];
ALTER DATABASE ['+@DbName+'] SET RECOVERY '+@RecoveryModel+' WITH NO_WAIT;
ALTER DATABASE ['+@DbName+'] SET RECOVERY '+@RecoveryModel+';
--'+Convert(nvarchar(20),GETDATE())+':完成;
-------------------------------------------------------------------------------
'
--print @sql
exec (@sql)
print '-------------------------------------------------------------------------'
fetch next from currsor1 into @DbName,@RecoveryModel
end
close currsor1
deallocate currsor1
declare @i int
set @i=1
declare @DbCount int
set @DbCount=(select COUNT(name) from sys.databases)
--select * from sys.databases
while(@i<@DbCount)
begin
declare @DbName nvarchar(max)
declare @DbLog nvarchar(max)
declare @sql nvarchar(max)
set @DbName=(select top 1 name from sys.databases where database_id=@i and name<>'tempdb')
set @sql=N'
declare @DbLog nvarchar(max);
USE ['+@DbName+'];
set @DbLog=(select name from sys.database_files where [type]=1);
USE [master];
ALTER DATABASE ['+@DbName+'] SET RECOVERY SIMPLE WITH NO_WAIT;
ALTER DATABASE ['+@DbName+'] SET RECOVERY SIMPLE;
USE ['+@DbName+'] ;
exec (''DBCC SHRINKFILE ("''+@DbLog+''" , 11, TRUNCATEONLY)'');
USE [master];
ALTER DATABASE ['+@DbName+'] SET RECOVERY FULL WITH NO_WAIT;
ALTER DATABASE ['+@DbName+'] SET RECOVERY FULL;
'
--select @sql
exec (@sql)
set @i=@i+1
end