407 votes

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

Je dois rechercher dans un serveur SQL 2008 des procédures stockées contenant où peut-être le nom d'un champ de la base de données ou le nom d'une variable.

672voto

Kashif Points 3900
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%'

72 votes

Sachez que la définition de la routine est limitée à 4000 caractères, au cas où vous auriez une longue procédure. Utilisez plutôt la méthode OBJECTPROPERTY.

0 votes

J'ai utilisé une variante de cette méthode (avec une variable et en recherchant une procédure spécifique) pour obtenir le contenu du corps de la procédure (j'ai dû transférer le [texte] dans une variable, puis l'imprimer pour voir la procédure complète).

1 votes

Selon le plan d'exécution, la troisième variante semble être le moyen le plus performant d'obtenir ces données.

82voto

marc_s Points 321990

Procurez-vous un exemplaire de la gratuit Red-Gate SQL Search et commencez à profiter de la recherche dans SQL Server ! :-)

enter image description here

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

6 votes

C'est un excellent outil, que j'utilisais déjà avant de tomber sur cette question. Il convient de noter qu'il limite les résultats de la recherche à 150 par défaut. Voir ce qui suit post de forum pour savoir comment augmenter cette limite.

1 votes

C'est un outil super rapide et utilisable.

0 votes

Fonctions limitées mais outil génial.

37voto

David Smithers Points 600

Vous pouvez également essayer Recherche ApexSQL - plug-in SSMS gratuit d'ApexSQL.

enter image description here

0 votes

Essai gratuit en fait :(

15voto

Tom Points 104

Au cas où vous auriez besoin d'un schéma également :

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

12voto

Gary Kindel Points 5057
SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%FieldName%' 
AND ROUTINE_TYPE='PROCEDURE'

2 votes

Soyez prudent avec cela, cependant, car il est uniquement une correspondance de sous-chaîne. "NomChamps" pourrait apparaître dans un commentaire, ou une constante de chaîne, ou quelque chose comme ça. De plus, je doute que la recherche de [whatever] attrapera whatever (cela devient plus important lorsque vous recherchez des identifiants qualifiés par le schéma).

2 votes

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X