Die beiden am häufigsten bewerteten Antworten verwenden viele veraltete Tabellen, die vermieden werden sollten.
Hier ist ein viel saubererer Weg, dies zu tun.
Alle Tabellen abrufen, von denen eine gespeicherte Prozedur abhängt:
SELECT DISTINCT p.name AS proc_name, t.name AS table_name
FROM sys.sql_dependencies d
INNER JOIN sys.procedures p ON p.object_id = d.object_id
INNER JOIN sys.tables t ON t.object_id = d.referenced_major_id
ORDER BY proc_name, table_name
Funktioniert mit MS SQL SERVER 2005+
Liste der Änderungen:
sysdependssollte durchsys.sql_dependenciesersetzt werden- Die neue Tabelle verwendet
object_idstattid - Die neue Tabelle verwendet
referenced_major_idstattdepid
- Die neue Tabelle verwendet
- Verwendung von
sysobjectssollte durch fokussiertere Systemkatalogansichten ersetzt werden- Wie marc_s betonte, verwenden Sie stattdessen
sys.tablesundsys.procedures - Hinweis :Dies verhindert, dass überprüft werden muss, wo
o.xtype = 'p'(usw.)
- Wie marc_s betonte, verwenden Sie stattdessen
-
Außerdem besteht wirklich keine Notwendigkeit für einen CTE, der
ROW_NUMBER()verwendet nur um sicherzustellen, dass wir nur einen von jedem Datensatz zurückgegeben haben. Das istDISTINCTist da für!- Tatsächlich ist SQL intelligent genug, um DISTINCT hinter den Kulissen zu verwenden.
-
Ich lege als Beweismittel vor:Anlage A . Die folgenden Abfragen haben denselben Ausführungsplan!
-- Complex WITH MyPeople AS ( SELECT id, name, ROW_NUMBER() OVER(PARTITION BY id, name ORDER BY id, name) AS row FROM People) SELECT id, name FROM MyPeople WHERE row = 1 -- Better SELECT DISTINCT id, name FROM People