Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je obtenir la liste des tables dans la procédure stockée ?

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é par sys.sql_dependencies
    • La nouvelle table utilise object_id au lieu de id
    • La nouvelle table utilise referenced_major_id au lieu de depid
  • 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 et sys.procedures
    • Remarque :Cela évite d'avoir à vérifier où o.xtype = 'p' (etc.)
  • 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 que DISTINCT 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