2009-11-18 5 views
0

Je voulais rechercher toutes les procédures stockées pour l'apparition d'une sous-chaîne "x", puis-je le faire en SQL 2000? 2005? 2008?Outil de recherche de code SQL Server

..sans compléments?

Si non, quels sont les meilleurs ajouts gratuits disponibles pour chacun?

Désolé. J'aurais dû mentionner que je suis conscient de l'utilisation des données sysobjects pour ce faire. Mais il me semble qu'il devrait y avoir une interface graphique sympa devant cette fonctionnalité!

PAR EXEMPLE, quelque chose comme ceci:

http://screencast.com/t/Y2Q0YmU0Nzkt

+0

double: http://stackoverflow.com/questions/1364633/search-for-a-key-word-in-all-the-stored-procs- pour un -given-db –

+0

Désolé. J'aurais dû mentionner que je suis conscient de l'utilisation des données sysobjects pour ce faire. Mais il me semble qu'il devrait y avoir une interface graphique sympa devant cette fonctionnalité! – ChadD

Répondre

0

si j'étais vous, je ne voudrais pas utiliser un outil - il suffit d'exécuter un script pour faire la recherche pour vous, par exemple, le script SQL suivant va recherche tous les procs stockés dans une base pour une chaîne

Declare @search varchar(128) 

SET @search = '%' + 'search text' + '%' 


/***************************************************************************/ 

SELECT o.name As "Stored Procedures" 

      FROM SYSOBJECTS o INNER JOIN SYSCOMMENTS c 
         ON o.id = c.id 
      WHERE c.text LIKE @search 
         AND o.xtype = 'P' 
      GROUP BY o.name 
      ORDER BY o.name 

/**************************************************************************/ 

dans ce cas, le xtype « P » fait référence aux procédures stockées

+0

syscomments ne stocke que nvarchar (4000) donc cela échoue si la chaîne de recherche de 4 lettres commence à 3999 donc ce n'est pas fiable – gbn

+0

intéressant - je ne savais pas cela, merci pour les heads-up. – Scozzard

2

ont également répondu à here

De http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=32319

CREATE PROCEDURE sp_FindText @text varchar(8000), @findtype varchar(1)='P' AS 
SET NOCOUNT ON 
IF @findtype='P' SELECT DISTINCT Len(SubString(text,1, PatIndex('%' + @text + '%', text)))-Len(Replace(SubString(text,1, PatIndex('%' + @text + '%', text)),char(13),''))+1 AS Line, 
--PatIndex('%' + @text + '%', text) AS Position, 
OBJECT_NAME(id) AS ProcName 
FROM syscomments 
WHERE text like '%' + @text + '%' 
ORDER BY ProcName, Line 

IF @findtype='C' EXEC('SELECT TABLE_NAME + ''.'' + COLUMN_NAME AS TableColumn FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE ''%' + @text + '%'' ORDER BY TableColumn') 

IF @findtype='T' EXEC('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ''%' + @text + '%'' ORDER BY TABLE_NAME') 
GO 

Il ne recherches que du texte de définition de la procédure et la vue, il trouvera également des tables, des vues et des noms de colonnes:

EXEC sp_FindText 'myTable' --or-- EXEC sp_FindText 'myTable', 'P' --finds procedures/views containing 'myTable' in their definition/code 
EXEC sp_FindText 'myTable', 'T' --finds tables/views containing 'myTable' in their name 
EXEC sp_FindText 'myCol', 'C' --finds columns containing 'myCol' in their name 
+0

syscomments stocke uniquement nvarchar (4000) donc cela échoue si la chaîne de recherche de 4 lettres commence à 3999 donc ce n'est pas fiable – gbn

+0

S'il vous plaît arrêtez de voter une réponse manifestement erronée qui donnera des résultats trompeurs – gbn

+0

Je vais admettre que cela pourrait rater une recherche terme s'il traverse une limite de 4000 caractères. En regardant un échantillon rapide de 2 de nos bases de données, l'un a 14 sur 606 et l'autre a 33 sur 468 objets de plus de 4000 caractères. Je pense que vous devriez être assez malchanceux pour manquer un terme de recherche. Au lieu de mieux, je suis content de cette approche. –

1

Pour SQL Server 2005 et 2008, utiliser sys.sql_modules ou OBJECT_DEFINITION qui fournissent la sortie nvarchar (max)

SELECT OBJECT_NAME(object_id) FROM sys.sql_modules WHERE definition LIKE @MyString 
SELECT name FROM sys.objects WHERE OBJECT_DEFINITION(object_id) LIKE @MyString 

Pour SQL Server 2000, vous devez utiliser sycomments ou INFORMATION_SCHEMA.ROUTINES, mais ils fournissent nvarchar (4000). Par conséquent, n'est pas fiable. Vous auriez à concaténer sys.comments en une valeur de texte et de recherche que (et franchement, j'avez oublié comment le faire hors haut de ma tête)

D'autres questions où exactement la même question est mentionné

Questions connexes