Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

T-SQL:Gespeicherte Prozeduren im Zusammenhang mit Tabellen zyklisch anzeigen

Dabei wird das Informationsschema sowohl für Tabellen als auch für gespeicherte Prozeduren verwendet. Sie können die ROUTINE_TYPE-Bedingung ändern oder entfernen, um Funktionen hinzuzufügen, und Sie können den Tabellentyp ändern, um Ansichten zurückzugeben.

Diese Antwort erzeugt ihre Ergebnisse, indem sie überprüft, von welchen Tabellen eine gespeicherte Prozedur abhängt. Ich denke, dies wird ein viel genaueres Ergebnis sein, als zu prüfen, ob ein Name im Abfragetext enthalten ist. Wenn die Prozedur auf eine Tabelle in einem Kommentarbereich verweist, wird dieses Ergebnis nicht in der ersten Abfrage zurückgegeben, sondern in der zweiten und anderen Antworten, die gegeben werden.

SELECT t.TABLE_NAME, s.ROUTINE_NAME
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.ROUTINES s ON
    s.ROUTINE_NAME IN (SELECT referencing_entity_name 
        FROM sys.dm_sql_referencing_entities(TABLE_SCHEMA + '.' + TABLE_NAME, 'OBJECT'))
    AND s.ROUTINE_TYPE = 'PROCEDURE'
WHERE t.TABLE_TYPE = 'BASE TABLE'

bearbeiten :So erhalten Sie die Abhängigkeiten ohne die Funktion. (Ich mag diese Methode am liebsten)

SELECT DISTINCT t.name [TableName], p.name [ProcedureName]
FROM sys.objects t 
LEFT JOIN sys.sql_dependencies d ON
    d.referenced_major_id = t.object_id
LEFT JOIN sys.objects p ON
    p.object_id = d.object_id
    AND p.type = 'p'
WHERE t.type = 'u'

Wenn Ihre spezifische Verwendung darin besteht, nur eine Zeichenfolge zu finden, die mit einem Tabellennamen übereinstimmt, funktioniert Folgendes:

SELECT t.TABLE_NAME, s.ROUTINE_NAME 
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.ROUTINES s 
    ON CHARINDEX(t.TABLE_NAME, s.ROUTINE_DEFINITION) > 0
    AND s.ROUTINE_TYPE = 'PROCEDURE'
WHERE t.TABLE_TYPE = 'BASE TABLE'