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 consys.sql_dependencies
- La nueva tabla usa
object_id
en lugar deid
- La nueva tabla usa
referenced_major_id
en lugar dedepid
- La nueva tabla usa
- 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
ysys.procedures
- Nota :Esto evita tener que comprobar dónde
o.xtype = 'p'
(etc.)
- Como señaló marc_s, en su lugar use
-
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 queDISTINCT
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