GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <石教承,,Name>
-- Create date: <Create Date,2018-8-13,>
-- Description: <Description,数据库备份和清除工具,@BackupDir备份目录(如'E:\DBBackup\'),@DatabaseName备份数据库,@InvalidMonth清除备份所距离今天的月份数>
-- =============================================
Alter PROCEDURE [dbo].[P_ZTool_BackupAndClearDatabase]
@BackupDir nvarchar(300) ,
@DatabaseName nvarchar(100) ,
@InvalidMonth int
AS
BEGIN
--备份数据库
declare @sql varchar(200);
declare @File NVARCHAR(100);
DECLARE @dateTime NVARCHAR(20);
set @dateTime = REPLACE(CONVERT(varchar(10), GETDATE(), 120),'-','_')+'_'+ +REPLACE(CONVERT(varchar(10), GETDATE(), 8),':','_');
set @File=@BackupDir+@DatabaseName+'_'+@dateTime+'.Bak';
Backup database @DatabaseName to Disk=@File With NOINIT ,NOUNLOAD,NOSKIP,STATS=10,NOFORMAT
--启动xp_cmdshell
set @sql='
use msdb
exec sp_configure ''show advanced options'', 1;
reconfigure;
exec sp_configure ''xp_cmdshell'',1;
reconfigure; '
exec(@sql)
--将文件夹下文件和子文件夹存入表变量@Tab
DECLARE @Tab table (subdirectory nvarchar(Max),depth smallint,[file] bit)
insert @Tab exec master..xp_dirtree @BackupDir,1,1
declare @MyDatetime datetime
declare @Year int ,@Month int , @Day int
--循环遍历表变量中的文件,比对日期是否超过2个月,超过则删除
declare @subdirectory nvarchar(200)
declare @delFile nvarchar(200)
declare my_cursor cursor for (select subdirectory from @Tab)
--打开游标--
open my_cursor
--开始循环游标变量--
fetch next from my_cursor into @subdirectory
while @@FETCH_STATUS = 0
begin
set @Year= dbo.Get_StrArrayStrOfIndex(@subdirectory,'_',2)
set @Month= dbo.Get_StrArrayStrOfIndex(@subdirectory,'_',3)
set @Day= dbo.Get_StrArrayStrOfIndex(@subdirectory,'_',4)
set @MyDatetime=convert(varchar(4),@Year) +'-'+convert(varchar(2),@Month) +'-'+convert(varchar(2),@Day)
set @File=@BackupDir+@subdirectory
if(DATEDIFF ( MONTH,@MyDatetime,GETDATE () )>@InvalidMonth)
Begin
--select @MyDatetime,'删除文件:'+@File
set @sql='exec master.dbo.xp_cmdshell ''del '+@File+''''
exec( @sql)
End
else
--Begin
-- --select @MyDatetime ,'不删除文件:'+@subdirectory
--End
fetch next from my_cursor into @subdirectory
end
close my_cursor
deallocate my_cursor
END