sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo obtener la lista de tablas en el procedimiento almacenado?

Las dos respuestas más votadas usan muchas tablas en desuso que deben evitarse.
Aquí hay una forma mucho más limpia de hacerlo.

Obtener todas las tablas de las que depende un procedimiento almacenado:

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 con MS SQL SERVER 2005+

Lista de cambios:

  • sysdepends debe reemplazarse con sys.sql_dependencies
    • La nueva tabla usa object_id en lugar de id
    • La nueva tabla usa referenced_major_id en lugar de depid
  • Uso de sysobjects debe reemplazarse con vistas de catálogo del sistema más enfocadas
    • Como señaló marc_s, en su lugar use sys.tables y sys.procedures
    • Nota :Esto evita tener que comprobar dónde o.xtype = 'p' (etc.)
  • Además, realmente no hay necesidad de un CTE que use ROW_NUMBER() solo para asegurarnos de que solo se devuelva uno de cada conjunto de registros. Eso es lo que DISTINCT está ahí para!

    • De hecho, SQL es lo suficientemente inteligente como para usar DISTINCT en segundo plano.
    • Presento como prueba:Prueba A . ¡Las siguientes consultas tienen el mismo Plan de Ejecución!

      -- 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