Voici une petite procédure permettant de supprimer les fichiers datés de plus de n jours dans un répertoire Windows. Elle vous sera utile par exemple pour éviter de conserver des sauvegardes trop anciennes.
CREATE PROCEDURE [S_MAINT].[P_DELETE_FILES]
@DIR VARCHAR(1024), -- répertoire de stockage des fichiers
@DAYS SMALLINT -- nombre de jours de rétention des fichiers
AS
/******************************************************************************
* Frédéric Brouard - alias SQLpro - http://sqlpro.developpez.com - 2011-05-08 *
*******************************************************************************
* Suppression de fichier anciens *
* @DIR : répertoire de stockage des fichiers *
* @DAYS : nombre de jours de rétention des fichiers *
*******************************************************************************
* copyright : Frédéric Brouard / SQLpro / SQLspot - http://www.sqlspot.com *
* Expertise, audit, tuning, optimisation, conseil, formation... MS SQL Server *
******************************************************************************/
BEGIN
SET NOCOUNT ON;
DECLARE @TF TABLE (FNAME VARCHAR(256), -- variable table des fichiers
FDATE DATETIME2(0),
FSIZE BIGINT)
DECLARE @T TABLE (F VARCHAR(512)); -- variable table de récupération de la commande système
DECLARE @COM VARCHAR(1048), -- variable de la commande système
@FN VARCHAR(256); -- variable du nom du fichier
-- composition de la commande système
SET @COM = ' DIR "' + @DIR
+ CASE
WHEN SUBSTRING(@DIR, LEN(@DIR), 1) = '\'
THEN ''
ELSE '\'
END + '*.*"';
-- exécution de la commande SQL et insertion des résultats dans la variable table @T
INSERT INTO @T
EXEC xp_cmdshell @COM;
-- suppression des lignes inutiles
DELETE FROM @T WHERE F IS NULL OR SUBSTRING(F, 1, 1) = ' ';
DELETE FROM @T WHERE SUBSTRING(F, 22, 5) = '<REP>';
-- paramétrage du format de date
SET DATEFORMAT DMY;
-- découpage des différents éléments des fichiers (nom, date, taille) et insertion dans la variables table @TF
INSERT INTO @TF
SELECT SUBSTRING(F, 37, 475),
REPLACE(SUBSTRING(F, 1, 17), ' ', ' '),
LTRIM(REPLACE(SUBSTRING(F, 19, 17), CHAR(160), ''))
FROM @T;
-- suppression des fichiers trop anciens
WHILE EXISTS(SELECT *
FROM @TF
WHERE FDATE < DATEADD(day, -10, CURRENT_TIMESTAMP))
BEGIN
SELECT TOP 1 @FN = FNAME
FROM @TF
WHERE FDATE < DATEADD(day, -10, CURRENT_TIMESTAMP);
SET @COM = 'DEL "' + @DIR + @FN + '"';
EXEC xp_cmdshell @COM;
DELETE FROM @TF WHERE FNAME = @FN;
END;
END;
GO
Exemple :
EXEC [S_MAINT].[P_DELETE_FILES] 'C:\tmp\', 10
supprime tous les fichiers vieux de plus de 10 jours dans le répertoire C:\tmp.
--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *