397 Stimmen

Wie finde ich eine gespeicherte Prozedur, die <Text> enthält?

Ich muss einen SQL Server 2008 nach gespeicherten Prozeduren durchsuchen, die vielleicht den Namen eines Datenbankfeldes oder den Namen einer Variablen.

14voto

Yuci Punkte 22138

Vergewissern Sie sich zunächst, dass Sie die Abfrage unter Ihren Benutzeranmeldedaten und im richtigen Datenbankkontext ausführen.

USE YOUR_DATABASE_NAME;

Andernfalls wird sys.procedures nichts zurückgeben. Führen Sie nun die Abfrage wie unten beschrieben aus:

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

Eine andere Möglichkeit ist die Verwendung von INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION, aber beachten Sie, dass nur eine begrenzte Anzahl von Zeichen (d.h. die ersten 4000 Zeichen) der Routine gespeichert werden.

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

Ich habe mit Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) getestet.

11voto

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

8voto

Sandy Punkte 690

Ich habe versucht, oben Beispiel, aber es wurde nicht angezeigt, mehr als 4000 Zeichen dann ich es wenig Bit geändert und war in der Lage, ganze gespeicherte Prozedur Definition zu erhalten. Bitte sehen Sie das aktualisierte Skript unten -

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

6voto

Mourad Punkte 75

Für jeden SQL-Server, der neuer ist als 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

Wenn jemand mit SQL Server 2000 nicht weiterkommt, gibt es die Tabelle sql_modules nicht, also würde man syscomments verwenden. Man erhält mehrere Datensätze für gespeicherte Prozeduren, die größer als 4000 Zeichen sind, aber sie haben denselben c.Nummer so dass Sie die Teile zusammenfassen können, um den vollständigen Text der gespeicherten Prozedur zu erhalten:

    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

3voto

Channdeep Singh Punkte 81
select * from sys.system_objects
where name like '%cdc%'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X