Ich muss einen SQL Server 2008 nach gespeicherten Prozeduren durchsuchen, die vielleicht den Namen eines Datenbankfeldes oder den Namen einer Variablen.
Antworten
Zu viele Anzeigen?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.
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
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