Come trovo una procedura memorizzata contenente <testo>?


Risposte:


557
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
    FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_DEFINITION LIKE '%Foo%' 
    AND ROUTINE_TYPE='PROCEDURE'

SELECT OBJECT_NAME(id) 
    FROM SYSCOMMENTS 
    WHERE [text] LIKE '%Foo%' 
    AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
    GROUP BY OBJECT_NAME(id)

SELECT OBJECT_NAME(object_id)
    FROM sys.sql_modules
    WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
    AND definition LIKE '%Foo%'

61
Ricorda che routine_definition viene ritagliata a 4000 caratteri nel caso in cui tu abbia una procedura lunga. Utilizzare invece il metodo OBJECTPROPERTY.
PeteT,

1
Secondo il piano di esecuzione, la terza variante sembra essere il modo più efficace per ottenere questi dati.
TMcManemy,

1
Un milione di volte ciò che ha detto @PeteT. Questo limite di 4000 caratteri mi ha davvero morso qualche anno fa.
Fiume Vivian,

14
Puoi aggiungere qualche spiegazione su cosa fanno ognuna delle 3 domande e quali sono le differenze?
Tot Zam,

3
Sarebbe bello avere alcuni dettagli su ciò che ogni query sta facendo e su come sono diversi o perché uno è migliore dell'altro. Questo tipo di risposte incoraggia incollaggi ciechi / copia da parte di ingegneri meno esperti e frustrazione per gli ingegneri più senior che lavorano con un nuovo RDBMS come SQL Server.
DavidScherer,

78

Prendi una copia dello strumento gratuito di ricerca SQL di Red-Gate e inizia a goderti la ricerca in SQL Server! :-)

inserisci qui la descrizione dell'immagine

È uno strumento eccezionale e molto utile e SÌ! è totalmente, assolutamente GRATUITO per qualsiasi tipo di utilizzo.


5
Questo è uno strumento eccellente, che avevo già usato prima di affrontare questa domanda. Vale la pena notare che limita i risultati della ricerca a 150 per impostazione predefinita. Dai un'occhiata a questo post del forum per informazioni su come aumentare tale limite.
Scott,

1
È uno strumento super veloce e utilizzabile.
Suat Atan PhD,

Funzionalità limitate ma strumento fantastico.
Aishwarya Shiva,


32

Ho preso la risposta di Kashif e li ho uniti tutti insieme. Stranamente, a volte, ho trovato risultati in una delle scelte ma non nell'altra. Quindi, per sicurezza, corro tutti e 3 quando cerco qualcosa. Spero che questo ti aiuti:

DECLARE @SearchText varchar(1000) = 'mytext';

SELECT DISTINCT SPName 
FROM (
    (SELECT ROUTINE_NAME SPName
        FROM INFORMATION_SCHEMA.ROUTINES 
        WHERE ROUTINE_DEFINITION LIKE '%' + @SearchText + '%' 
        AND ROUTINE_TYPE='PROCEDURE')
    UNION ALL
    (SELECT OBJECT_NAME(id) SPName
        FROM SYSCOMMENTS 
        WHERE [text] LIKE '%' + @SearchText + '%' 
        AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
        GROUP BY OBJECT_NAME(id))
    UNION ALL
    (SELECT OBJECT_NAME(object_id) SPName
        FROM sys.sql_modules
        WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
        AND definition LIKE '%' + @SearchText + '%')
) AS T
ORDER BY T.SPName

12

Nel caso avessi bisogno anche di uno schema:

SELECT   DISTINCT SCHEMA_NAME(o.schema_id),o.name,[text]
FROM     syscomments AS c
         INNER JOIN sys.objects AS o ON c.id = o.[object_id]
         INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
WHERE    text LIKE '%foo%'
ORDER BY  SCHEMA_NAME(o.schema_id),o.name 

10
SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%FieldName%' 
AND ROUTINE_TYPE='PROCEDURE'

2
Fai attenzione, tuttavia, poiché è solo una corrispondenza di sottostringa. "FieldName" potrebbe verificarsi in un commento, una costante di stringa o qualcosa del genere. Inoltre, dubito che la ricerca [whatever]prenderà whatever(diventa più importante quando cerchi identificatori qualificati da schema).
un CVn del

2
Vedi il commento di @PeteT nella risposta accettata, sopra. INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION è ritagliato a 4000 caratteri. Pertanto, questo metodo non funzionerà se sono state memorizzate procedure di lunghezza superiore a 4000 caratteri.
TMcManemy,

7

Ho provato sopra l'esempio ma non mostrava più di 4000 caratteri, quindi l'ho modificato un po 'ed è stato in grado di ottenere l'intera definizione della procedura memorizzata. Si prega di consultare lo script aggiornato di seguito -

SELECT SCHEMA_NAME(O.SCHEMA_ID) [SCHEMA_NAME], O.NAME, OBJECT_DEFINITION(OBJECT_ID) TEXT
FROM   SYSCOMMENTS AS C
       INNER JOIN SYS.OBJECTS AS O ON C.ID = O.[OBJECT_ID]
       INNER JOIN SYS.SCHEMAS AS S ON O.SCHEMA_ID = S.SCHEMA_ID
WHERE  OBJECT_DEFINITION(OBJECT_ID) LIKE '%FOO%'
ORDER BY  SCHEMA_NAME(O.SCHEMA_ID), O.NAME

6

Assicurati innanzitutto di eseguire la query con le tue credenziali utente e anche nel giusto contesto del database.

USE YOUR_DATABASE_NAME;

Altrimenti, sys.procedures non restituirà nulla. Ora esegui la query come di seguito:

select * from sys.procedures p 
join sys.syscomments s on p.object_id = s.id 
where text like '%YOUR_TEXT%';

Un'altra opzione è quella di utilizzare INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION, ma tenere presente che contiene solo un numero limitato di caratteri (ovvero i primi 4000 caratteri) della routine.

select * from YOUR_DATABASE_NAME.INFORMATION_SCHEMA.ROUTINES
where ROUTINE_DEFINITION like '%YOUR_TEXT%';

Ho testato su Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)



2

Ecco la versione del sindacato che utilizza Losbear fatta, ma modificata in modo da generare anche il nome dello schema:

DECLARE @SearchText varchar(1000) = 'searchtext';

SELECT DISTINCT sc.SPECIFIC_SCHEMA as 'Schema', sp.SPName as 'Name'
FROM (
    (SELECT ROUTINE_NAME SPName
        FROM INFORMATION_SCHEMA.ROUTINES 
        WHERE ROUTINE_DEFINITION LIKE '%' + @SearchText + '%' 
        AND ROUTINE_TYPE='PROCEDURE')
    UNION ALL
    (SELECT OBJECT_NAME(id) SPName
        FROM SYSCOMMENTS 
        WHERE [text] LIKE '%' + @SearchText + '%' 
        AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
        GROUP BY OBJECT_NAME(id))
    UNION ALL
    (SELECT OBJECT_NAME(object_id) SPName
        FROM sys.sql_modules
        WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
        AND definition LIKE '%' + @SearchText + '%')
) AS sp
CROSS APPLY (select SPECIFIC_SCHEMA from INFORMATION_SCHEMA.ROUTINES r where r.ROUTINE_NAME = sp.SPName) sc
ORDER BY 1

2

Come trovare una procedura memorizzata contenente testo o stringa

Molte volte dobbiamo trovare il testo o la stringa nella procedura memorizzata. Ecco la query per trovare il testo contenente.

SELECT OBJECT_NAME(id) 
FROM SYSCOMMENTS 
WHERE [text] LIKE '%Text%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
GROUP BY OBJECT_NAME(id)

Per ulteriori informazioni, consultare l'URL indicato di seguito.

http://www.freshcodehub.com/Article/34/how-to-find-a-stored-procedure-containing-text-or-string


2

Per qualsiasi server SQL più recente di SQL server 2000:

SELECT object_name = OBJECT_NAME(sm.object_id), o.type_desc, sm.definition  
FROM sys.sql_modules AS sm  
JOIN sys.objects AS o ON sm.object_id = o.object_id  
WHERE sm.definition like '%searchString%'  
ORDER BY  o.type, o.name, o.object_id

Se qualcuno è bloccato con SQL Server 2000, la tabella sql_modules non esiste, quindi useresti i syscomments, otterrai più record per gli archivi memorizzati più grandi di 4000 caratteri, ma avranno lo stesso campo c.number in modo da poter raggruppare le parti insieme per ottenere il testo completo della procedura memorizzata:

    Select o.id, c.number, o.name, c.text  
    from syscomments c 
    inner join sysobjects o on o.id = c.id 
    where c.encrypted = 0 and o.type = 'P'  
      and c.id in  
     (Select id from syscomments where text like '%searchtext%')
    order by objecttype, o.name, o.id, c.number, c.colid        


1
create Procedure [dbo].[TextFinder]
(@Text varchar(500),@Type varchar(2)=NULL) 
AS
BEGIN



SELECT DISTINCT o.name AS ObjectName,
CASE o.xtype

WHEN 'C' THEN 'CHECK constraint'

WHEN 'D' THEN 'Default or DEFAULT constraint'

WHEN 'F' THEN 'FOREIGN KEY constraint'

WHEN 'FN' THEN 'Scalar function'

WHEN 'IF' THEN 'In-lined table-function'

WHEN 'K' THEN 'PRIMARY KEY or UNIQUE constraint'

WHEN 'L' THEN 'Log'

WHEN 'P' THEN 'Stored procedure'

WHEN 'R' THEN 'Rule'

WHEN 'RF' THEN 'Replication filter stored procedure'

WHEN 'S' THEN 'System table'

WHEN 'TF' THEN 'Table function'

WHEN 'TR' THEN 'Trigger'`enter code here`

WHEN 'U' THEN 'User table'

WHEN 'V' THEN 'View'

WHEN 'X' THEN 'Extended stored procedure'

ELSE o.xtype

END AS ObjectType,

ISNULL( p.Name, '[db]') AS Location

FROM syscomments c

INNER JOIN sysobjects o ON c.id=o.id

LEFT JOIN sysobjects p ON o.Parent_obj=p.id

WHERE c.text LIKE '%' + @Text + '%' and

o.xtype = case when @Type IS NULL then o.xtype  else @Type end

ORDER BY Location, ObjectName

END

0
SELECT s.name + '.' + o.name ProcedureName
, c.text ProcedureSteps
FROM   sys.syscomments c 
INNER JOIN
sys.objects o 
ON 
c.id = o.object_id
INNER JOIN
sys.schemas s 
ON 
o.schema_id = s.schema_id
WHERE  o.type = 'P'
AND c.text LIKE N'%XXXX%'
ORDER BY s.name + '.' + o.name
, c.colid

Questa query restituisce il nome e il contenuto di qualsiasi procedura memorizzata in cui si fa riferimento a "XXXX" all'interno della procedura memorizzata.

Ciò è molto utile quando si trovano procedure che fanno riferimento a una tabella / vista / procedura specifica


0
SELECT * FROM sys.procedures WHERE Name LIKE '%CompanySpecialisation%'

Questo è ciò che ho scritto in SQL 2012 per selezionare tutte le procedure memorizzate in cui nome come "AziendaSpecializzazione"


0

Stored procedure per trovare testo in SP .. {Dinesh Baskaran} Trendy Global Systems pvt ltd

  create Procedure [dbo].[TextFinder]
 (@Text varchar(500),@Type varchar(2)=NULL)
AS
BEGIN





SELECT DISTINCT o.name AS ObjectName, 
CASE o.xtype 
WHEN 'C' THEN 'CHECK constraint ' 
WHEN 'D' THEN 'Default or DEFAULT constraint'
WHEN 'F' THEN 'FOREIGN KEY constraint'
WHEN 'FN' THEN 'Scalar function'
WHEN 'IF' THEN 'In-lined table-function'
WHEN 'K' THEN 'PRIMARY KEY or UNIQUE constraint'
WHEN 'L' THEN 'Log'
WHEN 'P' THEN 'Stored procedure'
WHEN 'R' THEN 'Rule'
WHEN 'RF' THEN 'Replication filter stored procedure' 
WHEN 'S' THEN 'System table'  
WHEN 'TF' THEN 'Table function' 
WHEN 'TR' THEN 'Trigger'  
WHEN 'U' THEN 'User table' 
WHEN 'V' THEN 'View' 
WHEN 'X' THEN 'Extended stored procedure' 
ELSE o.xtype 
END AS ObjectType,  

ISNULL( p.Name, '[db]') AS Location

FROM syscomments c

INNER JOIN sysobjects o ON c.id=o.id

LEFT JOIN sysobjects p ON o.Parent_obj=p.id

WHERE c.text LIKE '%' + @Text + '%' and

o.xtype = case when @Type IS NULL then o.xtype  else @Type end 


ORDER BY Location, ObjectName



END

0
SELECT OBJECT_NAME(id)     
FROM syscomments 
WHERE [text] LIKE '%Name%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
GROUP BY OBJECT_NAME(id)

Prova questo .....


0
sp_msforeachdb 'use ?;select name,''?'' from sys.procedures where object_definition(object_id) like ''%text%'''

Ciò cercherà in tutte le procedure memorizzate di tutti i database. Questo funzionerà anche per lunghe procedure.


0

Uso questo script. Se si modificano i commenti XML per visualizzarli come testo nero su uno sfondo giallo, si ottiene l'effetto di evidenziare il testo che si sta cercando nella colonna XML dei risultati. (Strumenti -> Opzioni -> Ambiente -> Caratteri e colori [Visualizza elementi: commento XML]

    ---------------------------------------------
    --------------   Start  FINDTEXT   ----------
    ---------------------------------------------

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
    SET NOCOUNT ON
    GO
    DECLARE @SearchString VARCHAR(MAX) 
    SET @SearchString = 'the text you''re looking for'
    DECLARE @OverrideSearchStringWith VARCHAR(MAX) 
    --#############################################################################
    -- Use Escape chars in Brackets []  like [%] to find percent char.
    --############################################################################# 

    DECLARE @ReturnLen INT 
    SET @ReturnLen = 50;
    with    lastrun
              as (select    DEPS.OBJECT_ID
                           ,MAX(last_execution_time) as LastRun
                  from      sys.dm_exec_procedure_stats DEPS
                  group by  deps.object_id
                 )
        SELECT  OL.Type
               ,OBJECT_NAME(OL.Obj_ID) AS 'Name'
               ,LTRIM(RTRIM(REPLACE(SUBSTRING(REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), ''), CHARINDEX(@SearchString, OBJECT_DEFINITION(OL.Obj_ID)) - @ReturnLen, @ReturnLen * 2), @SearchString, '   ***-->>' + @SearchString + '<<--***  '))) AS SourceLine
               ,CAST(REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(MAX), REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), '')), '&', '(A M P)'), '<', '(L T)'), '>', '(G T)'), @SearchString, '<!-->' + @SearchString + '<-->') AS XML) AS 'Hilight Search'
               ,(SELECT [processing-instruction(A)] = REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), '')
                FOR
                 XML PATH('')
                    ,TYPE
                ) AS 'code'
               ,Modded AS Modified
               ,LastRun as LastRun
        FROM    (SELECT CASE P.type
                          WHEN 'P' THEN 'Proc'
                          WHEN 'V' THEN 'View'
                          WHEN 'TR' THEN 'Trig'
                          ELSE 'Func'
                        END AS 'Type'
                       ,P.OBJECT_ID AS OBJ_id
                       ,P.modify_Date AS modded
                       ,LastRun.LastRun
                 FROM   sys.Objects P WITH (NOLOCK)
                        LEFT join lastrun on P.object_id = lastrun.object_id
                 WHERE  OBJECT_DEFINITION(p.OBJECT_ID) LIKE '%' + @SearchString + '%'
                        AND type IN ('P', 'V', 'TR', 'FN', 'IF', 'TF')
                     --   AND lastrun.LastRun  IS NOT null
                ) OL
    OPTION  (FAST 10)

    ---------------------------------------------
    ----------------    END     -----------------
    ---------------------------------------------
    ---------------------------------------------
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.