USE [HCITools] GO IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CleanUp_History]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[CleanUp_History] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[CleanUp_History] AS /*============================================================================= Explication du traitement realise par la SP ------------------------------------------- La SP va purger l'historique des jobs plus ancien de 3 mois Contexte d'utilisation ---------------------- Appelé depuis le job D93010 - Daily clean-up Parametres ---------- Creation : 28.10.16 / FLA Modifications : 08.03.2018 / RTC Reduce history for Repl-Distribution category jobs 09.02.2021 / SPE #TFS63542# - Adapt purge DR jobs daily treatment 18.02.2021 / SPE #TFS63542# - Adapt purge DR jobs daily treatment - Resolve bug Oldest_date at the top of cursor =============================================================================*/ SET NOCOUNT ON DECLARE @job_id UNIQUEIDENTIFIER, @Oldest_date DATETIME, @tot INT, @daycount SMALLINT BEGIN TRY /* PURGE MORE THAN 3 MONTHS */ SET @Oldest_date = dateadd(mm,-3,GETDATE()) EXEC msdb..sp_delete_backuphistory @oldest_date=@Oldest_date EXEC msdb..sp_maintplan_delete_log @oldest_time=@Oldest_date EXEC msdb..sysmail_delete_mailitems_sp @sent_before=@Oldest_date DECLARE c_jobs CURSOR LOCAL FORWARD_ONLY STATIC FOR SELECT jobs.job_id FROM msdb..sysjobs jobs OPEN c_jobs FETCH NEXT FROM c_jobs INTO @job_id WHILE @@fetch_status <> -1 BEGIN IF @@fetch_status <> -2 BEGIN SET @Oldest_date = dateadd(mm,-3,GETDATE()) /* PURGE MORE THAN 3 MONTHS JOB BY JOB */ EXEC msdb.dbo.sp_purge_jobhistory @job_id = @job_id, @oldest_date = @Oldest_date /* PURGE ALL IF MORE THAN 2000 HISTORY DAY BY DAY */ SELECT @tot = count(*) FROM msdb.dbo.sysjobhistory h with (nolock) JOIN msdb.dbo.sysjobs j with (nolock) ON j.job_id = h.job_id WHERE j.job_id = @job_id SET @daycount = -90 WHILE (@tot > 2000) BEGIN SET @Oldest_date = dateadd(dd,@daycount,GETDATE()) EXEC msdb.dbo.sp_purge_jobhistory @job_id = @job_id, @oldest_date = @Oldest_date SET @daycount = @daycount + 1 SELECT @tot = count(*) FROM msdb.dbo.sysjobhistory h with (nolock) JOIN msdb.dbo.sysjobs j with (nolock) ON j.job_id = h.job_id WHERE j.job_id = @job_id END END FETCH NEXT FROM c_jobs INTO @job_id END CLOSE c_jobs DEALLOCATE c_jobs /*---------------------- Traitement des erreurs ----------------------*/ END TRY BEGIN CATCH /* Traitement des erreurs (avec RaiseError) */ EXEC dbo.get_Error_Info @in_RaiseError = 1 END CATCH GO