Comment trouver une procédure stockée contenant <text>?

313

J'ai besoin de rechercher sur un serveur SQL 2008 des procédures stockées contenant où peut-être le nom d'un champ de base de données ou le nom d'une variable.

Gary Kindel
la source

Réponses:

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%'
Kashif
la source
61
Soyez conscient que routine_definition est recadrée à 4000 caractères au cas où vous auriez une longue procédure. Utilisez plutôt la méthode OBJECTPROPERTY.
PeteT
1
Selon le plan d'exécution, la troisième variante semble être le moyen le plus performant d'obtenir ces données.
TMcManemy
1
Un million de fois ce que @PeteT a dit. Cette limite de 4000 caractères m'a vraiment mordu il y a quelques années.
Vivian River
14
Pouvez-vous ajouter quelques explications sur ce que font chacune des 3 requêtes et quelle est la différence entre elles?
Tot Zam
3
Ce serait bien d'avoir des détails sur ce que fait chaque requête et comment elles sont différentes ou pourquoi l'une est meilleure que l'autre. Ces types de réponses encouragent le collage aveugle / copié par des ingénieurs moins expérimentés et la frustration pour les ingénieurs plus expérimentés travaillant avec un nouveau SGBDR tel que SQL Server.
DavidScherer
78

Prenez - vous une copie de la libre Red-Gate SQL Recherche outil et commencer à profiter de la recherche dans SQL Server! :-)

entrez la description de l'image ici

C'est un outil formidable et très utile, et OUI! c'est totalement, absolument GRATUIT pour tout type d'utilisation.

marc_s
la source
5
Il s'agit d'un excellent outil, que j'avais déjà utilisé avant d'en venir à cette question. Il convient de noter qu'il limite les résultats de recherche à 150 par défaut. Consultez cet article du forum pour savoir comment augmenter cette limite.
Scott
1
C'est un outil super rapide et utilisable.
Suat Atan PhD
Fonctionnalités limitées mais outil génial.
Aishwarya Shiva
32

J'ai pris la réponse de Kashif et les ai tous réunis. Étrangement, parfois, j'ai trouvé des résultats dans l'une des sélections mais pas dans l'autre. Donc pour être en sécurité, je lance les 3 quand je cherche quelque chose. J'espère que cela t'aides:

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
Losbear
la source
12

Si vous avez également besoin d'un schéma:

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 
À M
la source
10
SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%FieldName%' 
AND ROUTINE_TYPE='PROCEDURE'
Gary Kindel
la source
2
Soyez prudent avec cela, car ce n'est qu'une correspondance de sous-chaîne. "FieldName" peut apparaître dans un commentaire, une constante de chaîne ou quelque chose du genre. En outre, je doute que la recherche de [whatever]capture whatever(devienne plus importante lorsque vous recherchez des identificateurs qualifiés par schéma).
un CVn
2
Voir le commentaire de @ PeteT dans la réponse acceptée ci-dessus. INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION est rogné à 4000 caractères. En tant que telle, cette méthode ne fonctionnera pas si vous avez des procédures stockées de plus de 4000 caractères.
TMcManemy
7

J'ai essayé l'exemple ci-dessus mais il ne montrait pas plus de 4000 caractères puis je l'ai modifié un peu et j'ai pu obtenir la définition de la procédure stockée entière. Veuillez consulter le script mis à jour ci-dessous -

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
Sablonneux
la source
6

Assurez-vous d'abord que vous exécutez la requête sous vos informations d'identification utilisateur, ainsi que dans le bon contexte de base de données.

USE YOUR_DATABASE_NAME;

Sinon, sys.procedures ne retournera rien. Exécutez maintenant la requête comme ci-dessous:

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

Une autre option consiste à utiliser INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION, mais sachez qu'il ne contient qu'un nombre limité de caractères (c'est-à-dire les 4 000 premiers caractères) de la routine.

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

J'ai testé sur Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)

Yuci
la source
3
select * from sys.system_objects
where name like '%cdc%'
Channdeep Singh
la source
2

Voici la version de l'union qui utilise Losbear, mais modifiée afin qu'elle génère également le nom du schéma:

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
Alexandre
la source
2

Comment rechercher une procédure stockée contenant du texte ou une chaîne

Plusieurs fois, nous devons trouver le texte ou la chaîne dans la procédure stockée. Voici la requête pour trouver le texte contenant.

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

Pour plus d'informations, veuillez vérifier l'URL indiquée ci-dessous.

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

Kamal Pratap
la source
2

Pour tout serveur SQL plus récent que 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

Si quelqu'un est bloqué avec SQL Server 2000, la table sql_modules n'existe pas, vous utiliserez donc syscomments, vous obtiendrez plusieurs enregistrements pour des procédures stockées de plus de 4000 caractères, mais ils auront le même champ c.number afin que vous puissiez regrouper les parties ensemble pour obtenir le texte complet de la procédure stockée:

    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        
Mourad
la source
1
SELECT name FROM sys.procedures WHERE Object_definition(object_id) LIKE '%FOO%'
Jitendra Sawant
la source
Est-ce qu'il recadre également le proc stocké à 4000 caractères?
Przemyslaw Remin
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
dîner
la source
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

Cette requête renvoie le nom et le contenu de toute procédure stockée où "XXXX" est référencé dans la procédure stockée.

Ceci est utile lors de la recherche de procédures faisant référence à une table / vue / procédure spécifique

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

C'est ce que j'ai écrit dans SQL 2012 pour sélectionner toutes les procédures stockées où le nom comme "CompanySpecialisation"

Tapan kumar
la source
0

Procédure stockée pour rechercher du texte dans 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
dinesh baskaran
la source
0
SELECT OBJECT_NAME(id)     
FROM syscomments 
WHERE [text] LIKE '%Name%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
GROUP BY OBJECT_NAME(id)

Essaye ça .....

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

Cela va rechercher dans toutes les procédures stockées de toutes les bases de données. Cela fonctionnera également pour les procédures longues.

Akshey Bhat
la source
0

J'utilise ce script. Si vous modifiez vos commentaires XML pour qu'ils s'affichent sous forme de texte noir sur fond jaune, vous obtenez l'effet de surligner le texte que vous recherchez dans la colonne xml des résultats. (Outils -> Options -> Environnement -> Polices et couleurs [Éléments d'affichage: Commentaire 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     -----------------
    ---------------------------------------------
    ---------------------------------------------
Jay Wheeler
la source