De to højest stemte svar bruger en masse forældede tabeller, som bør undgås.
Her er en meget renere måde at gøre det på.
Hent alle de tabeller, som en lagret procedure afhænger af:
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
Virkerer med MS SQL SERVER 2005+
Liste over ændringer:
sysdependsskal erstattes medsys.sql_dependencies- Den nye tabel bruger
object_idi stedet forid - Den nye tabel bruger
referenced_major_idi stedet fordepid
- Den nye tabel bruger
- Brug af
sysobjectsbør erstattes med mere fokuserede systemkatalogvisninger- Som marc_s påpegede, brug i stedet
sys.tablesogsys.procedures - Bemærk :Dette forhindrer at skulle kontrollere hvor
o.xtype = 'p'(osv.)
- Som marc_s påpegede, brug i stedet
-
Desuden er der virkelig ikke behov for en CTE, der bruger
ROW_NUMBER()bare for at sikre, at vi kun har én af hvert rekordsæt returneret. Det er hvadDISTINCTer der for!- Faktisk er SQL smart nok til at bruge DISTINCT bag kulisserne.
-
Jeg fremlægger som bevis:Bilag A . Følgende forespørgsler har den samme eksekveringsplan!
-- 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