USE [HCITools] GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Medor]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[Medor] GO USE [HCITools] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[Medor] @in_debug int = null, @in_Search sysname, @max_recursion int = 0 AS /*============================================================================= Explication du traitement realise par la SP ------------------------------------------- Cette SP sert à chercher dans l'ensemble des bases le texte passé en paramétre dans les SP, trigger etc... et les jobs Contexte d'utilisation ---------------------- Cette SP est appelée à la main Parametres ---------- @in_debug : non utilisé pour le moment @in_Search : texte à chercher @max_recursion : nombre maximum de récursion (défaut 0) Creation : 25.07.17 / FLA Modifications : =============================================================================*/ set nocount on; declare @result_sp int, @errno int, @errmsg varchar(255) /*------------------- Declaration des variables --------------------*/ declare @cmd varchar(max), @name sysname /*------------ Affectation des parametres aux variables ------------*/ /*-------------------------- Traitement ---------------------------*/ create table #ObjectLink ( OL_guid uniqueidentifier default newid(), OL_Database sysname, OL_schema sysname, OL_sysobject_name sysname, OL_contained_piece sysname, OL_TexteAround varchar(110), OL_recursion_level int, OL_sysobject_id int, OL_sysobject_xtype char (2) ) ; CREATE NONCLUSTERED INDEX Ix_ObjectLink_OL_sysobject_name ON #ObjectLink(OL_sysobject_name) ; CREATE NONCLUSTERED INDEX Ix_ObjectLink_OL_contained_piece ON #ObjectLink(OL_contained_piece) ; declare c_databases cursor local forward_only static for SELECT name FROM sys.databases ORDER BY name open c_databases ; FETCH NEXT FROM c_databases into @name while @@fetch_status = 0 begin select @cmd = 'insert into #ObjectLink (OL_Database,OL_schema,OL_sysobject_name, OL_contained_piece, OL_TexteAround, OL_recursion_level, OL_sysobject_id, OL_sysobject_xtype) ( select distinct '''+@name+''',OBJECT_SCHEMA_NAME (so.id,DB_ID('''+@name+''')), so.name, '''+@in_Search+''' ''contained_piece'', SUBSTRING(sc.text,CHARINDEX('''+@in_Search+''',sc.text,0)-50,100) ''Texte around'', 0 ''recursion_level'', so.id, so.xtype from '+@name+'..syscomments sc with (nolock) join '+@name+'..sysobjects so with (nolock) on so.id = sc.id and so.name not like ''dt[_]%'' where sc.text like ''%'+@in_Search+'%'' and so.name <> '''+@in_Search+''' ) ; insert into #ObjectLink (OL_Database,OL_schema,OL_sysobject_name, OL_contained_piece, OL_TexteAround, OL_recursion_level, OL_sysobject_id, OL_sysobject_xtype) ( select distinct '''+@name+''',OBJECT_SCHEMA_NAME (so.id,DB_ID('''+@name+''')), so.name, '''+@in_Search+''' ''contained_piece'', NULL ''Texte around'', 0 ''recursion_level'', so.id, so.xtype from '+@name+'..sysobjects so with (nolock) where so.name not like ''dt[_]%'' and so.name = '''+@in_Search+''' ) ; declare @ObjectLinkCount_before int, @ObjectLinkCount_after int, @recursion int ; select @ObjectLinkCount_before = 0 ; select @ObjectLinkCount_after = count (*) from #ObjectLink ; select @recursion = 0 ; while @recursion < '+CAST(@max_recursion as varchar(2))+' and @ObjectLinkCount_after > @ObjectLinkCount_before begin select @recursion = @recursion + 1 ; select @ObjectLinkCount_before = @ObjectLinkCount_after ; insert into #ObjectLink (OL_Database,OL_schema,OL_sysobject_name, OL_contained_piece, OL_TexteAround, OL_recursion_level, OL_sysobject_id, OL_sysobject_xtype) ( select distinct '''+@name+''',OBJECT_SCHEMA_NAME (so.id,DB_ID('''+@name+''')), so.name, ol.OL_sysobject_name ''contained_piece'',SUBSTRING(sc.text,CHARINDEX('''+@in_Search+''',sc.text,0)-50,100) ''Texte around'', @recursion ''recursion_level'', so.id, so.xtype from '+@name+'..syscomments sc with (nolock) join '+@name+'..sysobjects so with (nolock) on so.id = sc.id and so.name not like ''dt[_]%'' join #ObjectLink ol on sc.text like ''%'' + ol.OL_sysobject_name + ''%'' and so.name not in (select OL_sysobject_name from #ObjectLink union all select OL_contained_piece from #ObjectLink ) and ol.OL_recursion_level = @recursion-1 ) ; select @ObjectLinkCount_after = count (*) from #ObjectLink ; end /* end while */ ;' --select @cmd exec (@cmd) FETCH NEXT FROM c_databases into @name ; end ; close c_databases ; deallocate c_databases select OL_recursion_level, OL_sysobject_xtype, case OL_sysobject_xtype when 'F' then 'Aggregate function (CLR)' when 'C ' then 'CHECK constraint' when 'D ' then 'Default or DEFAULT constraint' when 'F ' then 'FOREIGN KEY constraint' when 'L ' then 'Log' when 'FN ' then 'Scalar function' when 'FS ' then 'Assembly (CLR) scalar-function' when 'FT ' then 'Assembly (CLR) table-valued function' when 'IF ' then 'In-lined table-function' when 'IT ' then 'Internal table' when 'P ' then 'Stored procedure' when 'PC ' then 'Assembly (CLR) stored-procedure' when 'PK ' then 'PRIMARY KEY constraint (type is K)' when 'RF ' then 'Replication filter stored procedure' when 'S ' then 'System table' when 'SN ' then 'Synonym' when 'SQ ' then 'Service queue' when 'TA ' then 'Assembly (CLR) DML trigger' when 'TF ' then 'Table function' when 'TR ' then 'SQL DML Trigger' when 'TT ' then 'Table type' when 'U ' then 'User table' when 'UQ ' then 'UNIQUE constraint (type is K)' when 'V ' then 'View' when 'X ' then 'Extended stored procedure' else 'unknown xtype' end 'xtype_text', OL_schema, OL_Database, OL_sysobject_name, OL_contained_piece, OL_TexteAround from #ObjectLink ol order by OL_recursion_level, OL_sysobject_xtype,OL_Database,OL_schema, OL_sysobject_name, OL_contained_piece ; /*------------------------------------------------------------------------------------------------ Retourne les jobs qui appellent le bout de texte cherché ------------------------------------------------------------------------------------------------*/ select distinct * from ( select sj.name 'job_name', sjs.step_id, sjs.step_name, @in_Search 'contained_piece', SUBSTRING(sjs.command,CHARINDEX(''+@in_Search+'',sjs.command,0)-50,100) 'Texte around' from msdb.dbo.sysjobs sj with (nolock) join msdb.dbo.sysjobsteps sjs with (nolock) on sjs.job_id = sj.job_id where sjs.command like '%' + @in_Search + '%' union select sj.name 'job_name', sjs.step_id, sjs.step_name, ol.OL_contained_piece 'contained_piece', SUBSTRING(sjs.command,CHARINDEX(''+ol.OL_contained_piece+'',sjs.command,0)-50,100) 'Texte around' from msdb.dbo.sysjobs sj with (nolock) join msdb.dbo.sysjobsteps sjs with (nolock) on sjs.job_id = sj.job_id join #ObjectLink ol on sjs.command like '%' + ol.OL_contained_piece + '%' WHERE ol.OL_contained_piece <> @in_Search union select sj.name 'job_name', sjs.step_id, sjs.step_name, ol.OL_sysobject_name 'contained_piece', SUBSTRING(sjs.command,CHARINDEX(''+ol.OL_sysobject_name+'',sjs.command,0)-50,100) 'Texte around' from msdb.dbo.sysjobs sj with (nolock) join msdb.dbo.sysjobsteps sjs with (nolock) on sjs.job_id = sj.job_id join #ObjectLink ol on sjs.command like '%' + ol.OL_sysobject_name + '%' WHERE ol.OL_sysobject_name <> @in_Search ) vJobs order by vJobs.job_name, vJobs.step_id, vJobs.contained_piece ; DROP TABLE #ObjectLink /*------------------ Retour au programme appelant -----------------*/ return(@@error); /*---------------------- Traitement des erreurs ----------------------*/ error_99: raiserror (@errmsg, 16, 1); return(@errno); GO