Les deux réponses les plus votées utilisent beaucoup de tableaux obsolètes qui devraient être évités.
Voici une façon beaucoup plus propre de le faire.
Obtenir toutes les tables dont dépend une procédure stockée :
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
Fonctionne avec MS SQL SERVER 2005+
Liste des modifications :
sysdepends
doit être remplacé parsys.sql_dependencies
- La nouvelle table utilise
object_id
au lieu deid
- La nouvelle table utilise
referenced_major_id
au lieu dedepid
- La nouvelle table utilise
- Utiliser
sysobjects
devrait être remplacé par des vues de catalogue système plus ciblées- Comme l'a souligné marc_s, utilisez plutôt
sys.tables
etsys.procedures
- Remarque :Cela évite d'avoir à vérifier où
o.xtype = 'p'
(etc.)
- Comme l'a souligné marc_s, utilisez plutôt
-
De plus, il n'y a vraiment pas besoin d'un CTE qui utilise
ROW_NUMBER()
juste afin de nous assurer que nous n'avons qu'un seul exemplaire de chaque jeu d'enregistrements renvoyé. C'est ce queDISTINCT
est là pour !- En fait, SQL est suffisamment intelligent pour utiliser DISTINCT dans les coulisses.
-
Je dépose en preuve :Pièce A . Les requêtes suivantes ont le même plan d'exécution !
-- 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