So identifizieren Sie alle gespeicherten Prozeduren, die auf eine bestimmte Tabelle verweisen

136

Ich habe zu Testzwecken eine Tabelle zur Entwicklungsumgebung erstellt, und es gibt nur wenige SPs, die diese Tabelle referenzieren. Jetzt muss ich diese Tabelle löschen und alle SPs identifizieren, die auf diese Tabelle verweisen. Ich habe Schwierigkeiten, eine Liste aller SPs zu finden. Bitte schlagen Sie eine Abfrage vor, indem Sie davon ausgehen, dass der Tabellenname 'x' und die Datenbank SQL Server 2005 ist.

DJay
quelle

Antworten:

258
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

Übrigens - hier ist eine praktische Ressource für diese Art von Fragen: Abfragen der häufig gestellten Fragen zum SQL Server-Systemkatalog

Ketten
quelle
3
Gibt es einen Grund, dies über den Zugriff auf das ROUTINE_DEFINITIONOn zu tun INFORMATION_SCHEMA.ROUTINES?
Marie
1
@Marie - SQL-Server 2005 (AFAIK) hat das nicht.
Ketten
2
Frage: Findet diese Lösung referenzierte Objekte, wenn sie innerhalb einer Zeichenfolge referenziert werden ? wie,set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Jeff.Clark
1
@ Jeff.Clark - Es gibt eine einfache Möglichkeit, dies herauszufinden :-) - aber ja, es durchsucht den Text der Prozedur direkt, also würde es das finden.
Ketten
2
yeah yeah :) Es würde eine Weile dauern, bis ich den Test eingerichtet hatte, und ich suchte nur nach einer faulen / einfachen Antwort :)
Jeff.Clark
27

Das Folgende funktioniert unter SQL2008 und höher. Bietet eine Liste der gespeicherten Prozeduren und Funktionen.

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
  from sys.objects o inner join sys.sql_expression_dependencies  sd on o.object_id = sd.referenced_id
                inner join sys.objects sp on sd.referencing_id = sp.object_id
                    and sp.type in ('P', 'FN')
  where o.name = 'YourTableName'
  order by sp.Name
Guy Hollington
quelle
1
OP braucht die Antwort für SQL-Server-2005
Chains
19

Manchmal liefern die obigen Abfragen kein korrektes Ergebnis. Es ist eine integrierte gespeicherte Prozedur verfügbar, um die Tabellenabhängigkeiten wie folgt abzurufen:

EXEC sp_depends @objname = N'TableName';
Pramod Pawar
quelle
1
Für mich zeigte dies Auslöser und Ansichten, aber keine gespeicherten Prozesse.
NealWalters
1
HINWEIS: Ich habe dies auf einem System ausgeführt, auf dem ich Zugriff auf Tabellen hatte, jedoch nicht auf gespeicherte Prozesse. Daher wurden die gespeicherten Prozesse natürlich nicht im Ergebnis angezeigt.
NealWalters
18

Eine nicht abfragbare Möglichkeit wäre die Verwendung von SQL Server Management Studio.

Suchen Sie die Tabelle, klicken Sie mit der rechten Maustaste und wählen Sie "Abhängigkeiten anzeigen".

BEARBEITEN

Aber wie die Kommentatoren sagten, ist es nicht sehr zuverlässig.

Hans Keing
quelle
4
Im Jahr 2005 sind die Abhängigkeitsinformationen unzuverlässig, wenn Objekte nicht in der richtigen Reihenfolge erstellt werden.
Martin Smith
3
Wie @Martin Smith feststellte, wird eine gespeicherte Prozedur erstellt, die auf ein nicht vorhandenes Objekt verweist, allerdings mit einer Warnung, aber kein Eintrag wird in sysdepends platziert. Gleiches gilt auch für gespeicherte Prozeduren, die auf eine Tabelle in einer fremden Datenbank verweisen: In keiner Datenbank wird jemals ein Eintrag in sysdepends platziert. Eine weitere Funktion ist, dass das Löschen / Neuerstellen einer Tabelle oder Ansicht die Abhängigkeitskette unterbricht. Diese ... ähm ... Funktionen machen die Abhängigkeitsverfolgung von SQL Server so gut wie nutzlos.
Nicholas Carey
7

Die folgende Abfrage ruft alle Namen der gespeicherten Prozeduren und die entsprechende Definition dieser SPs ab

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'
Deepak Kothari
quelle
5
SELECT
    o.name
FROM
    sys.sql_modules sm
INNER JOIN sys.objects o ON
    o.object_id = sm.object_id
WHERE
    sm.definition LIKE '%<table name>%'

Denken Sie daran, dass dadurch auch SPs angezeigt werden, bei denen der Tabellenname in den Kommentaren steht oder bei denen der Tabellenname eine Teilzeichenfolge eines anderen verwendeten Tabellennamens ist. Wenn Sie beispielsweise Tabellen mit den Namen "test" und "test_2" haben und versuchen, mit "test" nach SPs zu suchen, erhalten Sie Ergebnisse für beide.

Tom H.
quelle
2
Das Abfragen syscommentsauf diese Weise ist für lange Prozeduren nicht zuverlässig, da die Definition in 4000 Zeichenblöcke über mehrere Zeilen aufgeteilt wird. sys.sql_modulesvermeidet dies.
Martin Smith
1
Guter Punkt. Ich habe es aktualisiert, um es sys.sql_modulesstattdessen zu verwenden .
Tom H
3
syscomments wurde in jedem meiner rund ein Dutzend Antworten auf dieselbe Frage entlarvt stackoverflow.com/…
gbn
5

Die folgende Abfrage funktioniert nur bei der Suche nach Abhängigkeiten in einer Tabelle und nicht in einer Spalte:

EXEC sp_depends @objname = N'TableName';

Die folgende Abfrage ist jedoch die beste Option, wenn Sie nach allen Arten von Abhängigkeiten suchen möchten. Dabei wird nichts übersehen. Es gibt tatsächlich mehr Informationen als erforderlich.

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name
Siraj Ansari
quelle
1
Für mich gab nichts auf SSMS 2014 zurück, das gegen Datenbank unter SQL Server 12.0 ausgeführt wurde)
NealWalters
3
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

Dies funktioniert, wenn Sie den Tabellennamen angeben müssen.

Ric
quelle
3

In Management Studio können Sie einfach mit der rechten Maustaste auf die Tabelle und dann auf "Abhängigkeiten anzeigen" klicken. Geben Sie hier die Bildbeschreibung ein

dann können Sie eine Liste von Objekten sehen, die Abhängigkeiten von Ihrer Tabelle haben:Geben Sie hier die Bildbeschreibung ein

nzrytmn
quelle
1

Sie haben grundsätzlich 2 Möglichkeiten:

----Option 1

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

----Option 2

SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

Mit diesen beiden Abfragen erhalten Sie alle gespeicherten Prozeduren, die auf die gewünschte Tabelle verweisen. Diese Abfrage basiert auf 2 sys-Tabellen, die sysobjects und syscomments sind. In den Sysobjekten werden alle Ihre DB-Objektnamen gespeichert, einschließlich der gespeicherten Prozeduren.

Das System enthält den Text für alle Ihre Verfahren.

Wenn Sie fragen : SELECT * FROM syscomments

Sie haben eine Tabelle mit der ID, die die Zuordnung zur sysobjects-Tabelle darstellt, wobei der in den gespeicherten Prozeduren enthaltene Text die letzte Spalte ist.

Alain Ghawi
quelle
0

Versuche dies

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'
Pooja Chavan
quelle