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 :
sysdependsdoit être remplacé parsys.sql_dependencies- La nouvelle table utilise
object_idau lieu deid - La nouvelle table utilise
referenced_major_idau lieu dedepid
- La nouvelle table utilise
- Utiliser
sysobjectsdevrait être remplacé par des vues de catalogue système plus ciblées- Comme l'a souligné marc_s, utilisez plutôt
sys.tablesetsys.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 queDISTINCTest 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