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:
sysdepends
sollte durchsys.sql_dependencies
ersetzt werden- Die neue Tabelle verwendet
object_id
stattid
- Die neue Tabelle verwendet
referenced_major_id
stattdepid
- Die neue Tabelle verwendet
- Verwendung von
sysobjects
sollte durch fokussiertere Systemkatalogansichten ersetzt werden- Wie marc_s betonte, verwenden Sie stattdessen
sys.tables
undsys.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 istDISTINCT
ist 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