De twee meest gestemde antwoorden gebruiken veel verouderde tabellen die moeten worden vermeden.
Hier is een veel schonere manier om dit te doen.
Verkrijg alle tabellen waarvan een opgeslagen procedure afhankelijk is:
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
Werkt met MS SQL SERVER 2005+
Lijst met wijzigingen:
sysdepends
moet worden vervangen doorsys.sql_dependencies
- De nieuwe tabel gebruikt
object_id
in plaats vanid
- De nieuwe tabel gebruikt
referenced_major_id
in plaats vandepid
- De nieuwe tabel gebruikt
- Gebruik
sysobjects
moet worden vervangen door meer gerichte systeemcatalogusweergaven- Zoals marc_s al aangaf, gebruik in plaats daarvan
sys.tables
ensys.procedures
- Opmerking :Dit voorkomt dat u moet controleren waar
o.xtype = 'p'
(enz.)
- Zoals marc_s al aangaf, gebruik in plaats daarvan
-
Er is ook echt geen CTE nodig die gebruikmaakt van
ROW_NUMBER()
gewoon om er zeker van te zijn dat we slechts één van elke recordset terugkrijgen. Dat is watDISTINCT
is er voor!- SQL is zelfs slim genoeg om DISTINCT achter de schermen te gebruiken.
-
Ik dien als bewijs in:Bewijsstuk A . De volgende queries hebben hetzelfde uitvoeringsplan!
-- 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