Le due risposte più votate utilizzano molte tabelle obsolete che dovrebbero essere evitate.
Ecco un modo molto più pulito per farlo.
Ottieni tutte le tabelle da cui dipende una procedura memorizzata:
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
Funziona con MS SQL SERVER 2005+
Elenco delle modifiche:
sysdepends
dovrebbe essere sostituito consys.sql_dependencies
- La nuova tabella utilizza
object_id
invece diid
- La nuova tabella utilizza
referenced_major_id
invece didepid
- La nuova tabella utilizza
- Utilizzo di
sysobjects
dovrebbe essere sostituito con viste del catalogo di sistema più mirate- Come ha sottolineato marc_s, usa invece
sys.tables
esys.procedures
- Nota :Questo evita di dover controllare dove
o.xtype = 'p'
(ecc.)
- Come ha sottolineato marc_s, usa invece
-
Inoltre, non c'è davvero bisogno di un CTE che utilizzi
ROW_NUMBER()
solo per assicurarci di avere restituito un solo record per ogni set di record. Ecco cosaDISTINCT
è lì per!- In effetti, SQL è abbastanza intelligente da usare DISTINCT dietro le quinte.
-
Presento come prova:Allegato A . Le seguenti query hanno lo stesso piano di esecuzione!
-- 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