Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso ottenere l'elenco delle tabelle nella procedura memorizzata?

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 con sys.sql_dependencies
    • La nuova tabella utilizza object_id invece di id
    • La nuova tabella utilizza referenced_major_id invece di depid
  • Utilizzo di sysobjects dovrebbe essere sostituito con viste del catalogo di sistema più mirate
    • Come ha sottolineato marc_s, usa invece sys.tables e sys.procedures
    • Nota :Questo evita di dover controllare dove o.xtype = 'p' (ecc.)
  • 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 cosa DISTINCT è 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