清除SQL数据库日志文件+ a- o! o. [/ s9 |, d
     
  有两种方式: 一、是压缩日志,二、是删除日志。lfty.5d6d.com2 ?) D6 D- [, Z/ {0 z1 W8 X

  一、压缩日志及数据库文件大小

     因为要对数据库进行分离处理,所以存储过程不能创建在被压缩的数据库中
    /*--调用示例听雨轩# ~% F. Q5 M6 U* @- ?3 [
    exec p_compdb 'test'听雨轩) x( Z1 E9 f/ _) a
    --*/听雨轩/ `( O  _( ]& U4 R. u4 Q

    use master   --注意:该存储过程要建在master数据库中
     go
lfty.5d6d.com$ M' g4 R1 _( t7 n
      if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_compdb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)( A0 t! d8 C$ v+ ^  y/ _( j
    drop procedure [dbo].[p_compdb]听雨轩& d" c  W/ h  b/ i8 z- E  }$ F  ?
    GO+ C* V3 }! Z3 X; _8 `

     create proc p_compdb
     @dbname sysname,    --要压缩的数据库名
     @bkdatabase bit=1,    --在分离日志的步骤中,可能会损坏数据库,可以选择是否自动备份数据库听雨轩7 \' `9 M. R2 w/ U
     @bkfname nvarchar(260)='' --备份的文件名,如果不指定,自动备份到默认备份目录,备份文件名为:数据库名+日期时间; F; X0 R/ J' K# @' K( B
as8 S8 r3 E0 L0 E. m

--1.清空日志lfty.5d6d.com( w* A) E2 R8 m1 [6 L  U
   exec('DUMP TRANSACTION ['+@dbname+'] WITH   NO_LOG')lfty.5d6d.com8 C) V7 l3 D4 {1 {8 U; f5 Q
+ |- ^% }% b8 G8 |4 N6 ~! o. z
--2.截断事务日志:+ e% n# a$ u& A; N( Z2 U( J
   exec('BACKUP LOG ['+@dbname+'] WITH NO_LOG')) n7 m, v# Q% e0 }
# N' D/ n! j: P" b6 H* a) B; U
  --3.收缩数据库文件(如果不压缩,数据库的文件不会减小
  exec('DBCC SHRINKDATABASE(['+@dbname+'])')
9 n: D6 Z& p6 x/ |' p/ k
--4.设置自动收缩听雨轩! u% @! j9 P" ]& L
   exec('EXEC sp_dboption '''+@dbname+''',''autoshrink'',''TRUE''')
听雨轩) T* y" `* r5 ^3 C0 i2 L' C
--后面的步骤有一定危险,请确保做好了数据库备份再选择下列的步骤
--5.分离数据库
if @bkdatabase=1听雨轩% _$ x9 k3 Q3 [
begin
if isnull(@bkfname,'')='' : p& Z2 y. ~# l) X9 L
   set @bkfname=@dbname+'_'+convert(varchar,getdate(),112)lfty.5d6d.com3 W0 F' I/ @1 w
    +replace(convert(varchar,getdate(),108),':','')
select 提示信息='备份数据库到SQL 默认备份目录,备份文件名:'+@bkfname
exec('backup database ['+@dbname+'] to disk='''+@bkfname+'''')
end* v  f$ B% f0 ]) ]* x: X
; t6 r1 K4 x1 W' P8 X
--进行分离处理8 M; _! \4 Y  t! |
create table #t(fname nvarchar(260),type int)% M! l# [0 l7 c- X  @" x# g4 ^4 ?
exec('insert into #t select filename,type=status&0x40 from ['+@dbname+']..sysfiles'), I2 K; y: R% h( A( J4 G* U* {/ j
exec('sp_detach_db '''+@dbname+'''')

--删除日志文件lfty.5d6d.com2 k; H" G" m* Y
declare @fname nvarchar(260),@s varchar(8000)
declare tb cursor local for select fname from #t where type=64
open tb 
fetch next from tb into @fname) k$ k+ `/ N% o
while @@fetch_status=0. O: @9 {, [& v  h# _
begin
set @s='del "'+rtrim(@fname)+'"'
exec master..xp_cmdshell @s,no_output. O" T8 w) e3 d
fetch next from tb into @fname. y" i9 z0 D& }0 |* l; i
end
close tb
deallocate tb
6 u, C& p7 h% q
--附加数据库
set @s=''( f, B! I; e! k$ o- c
declare tb cursor local for select fname from #t where type=0听雨轩- e, v5 s$ Z6 _7 V- p3 b; `: g/ ?
open tb 
fetch next from tb into @fname+ R$ C/ h0 k+ i9 E
while @@fetch_status=0% M4 B4 y+ M9 G1 [* i4 X* f
begin
set @s=@s+','''+rtrim(@fname)+''''
fetch next from tb into @fnamelfty.5d6d.com% o* u; F$ x, N) O! ^: v4 Z/ {  w
end- y5 Z9 w1 a- |' Q3 k2 K  F8 Q
close tb' F3 k0 P9 Q7 m
deallocate tblfty.5d6d.com5 v$ v! p$ K( F; s9 h9 X& h2 o
exec('sp_attach_single_file_db '''+@dbname+''''+@s)
go