Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso obter a lista de tabelas no procedimento armazenado?


As duas respostas mais votadas usam muitas tabelas obsoletas que devem ser evitadas.
Aqui está uma maneira muito mais limpa de fazer isso.

Obtenha todas as tabelas das quais um procedimento armazenado depende:

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

Funciona com MS SQL SERVER 2005+

Lista de alterações:

  • sysdepends deve ser substituído por sys.sql_dependencies
    • A nova tabela usa object_id em vez de id
    • A nova tabela usa referenced_major_id em vez de depid
  • Usando sysobjects deve ser substituído por visualizações de catálogo de sistema mais focadas
    • Como marc_s apontou, use sys.tables e sys.procedures
    • Observação :Isso evita ter que verificar onde o.xtype = 'p' (etc.)

  • Além disso, não há necessidade de um CTE que use ROW_NUMBER() apenas para garantir que apenas um de cada conjunto de registros seja retornado. É isso que DISTINCT existe para!
    • Na verdade, o SQL é inteligente o suficiente para usar DISTINCT nos bastidores.

    • Eu envio como evidência:Anexo A . As consultas a seguir possuem o mesmo Plano de Execução!
      -- 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