通過SQL儲存過程刪除過期的資料庫Bak備份檔案

iSQlServer發表於2009-11-23

1.先啟用 xp_cmdshell 擴充套件儲存過程:


<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtUse Master
GO
Exec sp_configure 'show advanced options'1
GO
Reconfigure;
GO
sp_configure 
'xp_cmdshell'1
GO
Reconfigure;
GO

 (注:因為xp_cmdshell是高階選項,所以這裡啟動xp_cmdshell,需要先將 show advanced option 設定為 1,便可顯示高階配置選項。

可以通過語句

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtSelect is_advanced From sys.configurations Where name=N'xp_cmdshell'

檢視是否高階選項。

)

 

 

 2.刪除檔案的儲存過程:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtIf object_id('sp_DeleteFiles'Is Not Null
    
Drop Proc sp_DeleteFiles
Go
Create Proc sp_DeleteFiles
(
    
@FilePath            nvarchar(128),
    
@SearchPattern        nvarchar(200),
    
@LastWriteTimeStart datetime,
    
@LastWriteTImeEnd    datetime
)
As
Set Nocount On
Declare @Cmd nvarchar(2000),
        
@OutputInfo nvarchar(2000),
        
@Dir nvarchar(2000),
        
@Date datetime,
        
@FileName nvarchar(512)

Declare @Tmp Table(ID int Identity(1,1Primary Key, OutputInfo nvarchar(2000))

Set @Cmd=N'Dir/A:-d/S/T:W/4 '+@FilePath+N'\'+Rtrim(@SearchPattern/*Dos顯示檔案程式碼*/
Insert Into @Tmp
    
Exec xp_cmdshell @Cmd

Declare Cur_dir Cursor For 
    
Select OutputInfo From @tmp  Where Patindex('%\%',OutputInfo)>0 Or IsDate(substring(OutputInfo,1,10))=1 /*過濾只留目錄和檔案列表*/
Open Cur_dir
Fetch Next From Cur_dir Into @OutputInfo
While @@Fetch_Status = 0
Begin
    
If Patindex('%\%',@OutputInfo)>0 /*提取目錄*/
        
Set @Dir=Substring(@OutputInfo,1,Len(@OutputInfo)-Charindex(Char(32),Reverse(@OutputInfo)))
    
Else
    
Begin
        
Set @Date=Substring(@OutputInfo,1,10)
        
If @Date Between @LastWriteTimeStart And @LastWriteTImeEnd
        
Begin
            
/*不同的環境,如在繁體系統,這裡取檔名的處理方法可能不同*/
            
Set @OutputInfo=Stuff(@OutputInfo,1,17,''/*過濾掉日期部分*/
            
Set @OutputInfo=Stuff(@OutputInfo,1,Patindex('%[0-9]%',@OutputInfo)-1,''/*過濾掉字首的空格部分*/
            
Set @FileName=Stuff(@OutputInfo,1,Charindex(Char(32),@OutputInfo),''/*取得檔名*/
            
Set @Cmd=N'Del '+@Dir+N'\'+@FileName
            
Exec xp_cmdshell @Cmd,No_output
            
Print N'已刪除檔案:'+@Dir+N'\'+@FileName
        
End
    
End
    
Fetch Next From Cur_dir Into @OutputInfo
End
Close Cur_dir
Deallocate Cur_dir
Go

 

 

 

 3. 測試:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtExec sp_DeleteFiles 'F:\test','*.exe','20011001','20091119'

/*
已刪除檔案: F:\test\Gao\高2009-8-14\B2000HR_FuXing_CHN_060406\HR_FuXing_071101.exe
已刪除檔案: F:\test\Gao\高2009-8-14\B2000HR_FuXing_CHN_060406\HR_FuXing_080127.exe
已刪除檔案: F:\test\Gao\高2009-8-14\B2000HR_FuXing_CHN_060406\HR_FuXing_080326.exe
已刪除檔案: F:\test\Gao\高2009-8-14\B2000HR_FuXing_CHN_060406\HR_FuXing_080328.exe
已刪除檔案: F:\test\Gao\高2009-8-14\B2000HR_FuXing_CHN_060406\HR_FuXing_080504.exe
已刪除檔案: F:\test\Gao\高2009-8-14\B2000HR_FuXing_CHN_060406\HR_FuXing_080628.exe

*/

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-620296/,如需轉載,請註明出處,否則將追究法律責任。

相關文章