Thursday 26 September 2013

DELETE OLD BACKUP

Delete old backup

Change the number of days,
specify the number of days, and read the comments


Declare all the variables to be used
------------------------------------
Declare @FileName varchar(100),
@DynDelete varchar(100),
@path varchar(100),
@DifDays varchar (100)=--specify number of days--



Enable the xp_cmdshell
----------------------
exec sp_configure 'show advanced options', 1
reconfigure
exec sp_configure 'xp_cmdshell', 1
reconfigure



Create temp tables
------------------
create table #dir
(dir varchar(255))

create table #tobdelted
(nameoffile varchar(255),filedate datetime)

create table #tobdelted2
(nameoffile varchar(255),filedate datetime)




Insert files found into temp table (Please change path)
-------------------------------------------------------
insert into #dir exec master..xp_cmdshell 'dir "C:\Program Files\Microsoft SQL Server\MSSQL11.MATDATACENTRE\MSSQL\Backup"'
set @path= '"C:\Program Files\Microsoft SQL Server\MSSQL11.MATDATACENTRE\MSSQL\Backup\"'




Change the folder path, do not forget the "\" at the end of the path

Insert files to be deleted into appropriate table
-------------------------------------------------
insert into #tobdelted
            (filedate,nameoffile)
select convert(date,(select SUBSTRING(dir,1,10)),110),( SELECT SUBSTRING(
(SELECT SUBSTRING(
(SELECT SUBSTRING(
(SELECT SUBSTRING(DIR, CHARINDEX(' ', DIR) + 1, 255)),
CHARINDEX(' ', DIR),255)),
CHARINDEX(' ', DIR),255)),
(CHARINDEX(' ', DIR)-2),255))
from #dir
where (dir like '%/%%/%') and (dir like '%.trn' or dir like '%.bak')


Insert files to be deleted into appropriate table
-------------------------------------------------
insert into #tobdelted2
            (filedate,nameoffile)
select filedate,nameoffile
from #tobdelted
WHERE (DATEDIFF(month, (select convert(varchar(100),filedate,110)), GETDATE()) = 0
and DATEDIFF(day,(select convert(varchar(100),filedate,110)),getdate())>@DifDays) or
(
DATEDIFF(month, (select convert(varchar(100),filedate,110)), GETDATE())!=0
)




Use Cursor to delete the files
------------------------------
DECLARE curDelFile CURSOR
READ_ONLY
FOR
SELECT[nameoffile]
FROM #tobdelted2
OPEN curDelFile

FETCH NEXT FROM curDelFile INTO @FileName
WHILE (@@fetch_status <> -1)
BEGIN

IF (@@fetch_status <> -2)
BEGIN
 SET @DynDelete = 'DEL '+@path + @FileName + ' '
 EXEC master..xp_cmdshell @DynDelete

 -- print 'EXEC master..xp_cmdshell'+@DynDelete

END

FETCH NEXT FROM curDelFile INTO @FileName
END

CLOSE curDelFile
DEALLOCATE curDelFile

Delete temp tables
------------------
BEGIN TRY
 drop table #dir
drop table #tobdelted
drop table #tobdelted2
END TRY
BEGIN CATCH
 Print 'Tables do not exist'
END CATCH




DiSable xp_cmdshell proc
------------------------
exec sp_configure 'xp_cmdshell', 0
reconfigure
exec sp_configure 'show advanced options', 0

reconfigure

No comments: