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

T-SQL:Mostrar procedimientos almacenados relacionados con tablas, cíclicamente

Esto utiliza un esquema de información tanto para las tablas como para los procedimientos almacenados. Puede cambiar o deshacerse de la condición ROUTINE_TYPE para agregar funciones, y puede cambiar el tipo de tabla para devolver vistas.

Esta respuesta produce sus resultados al verificar de qué tablas depende un procedimiento almacenado. Creo que este será un resultado mucho más preciso que verificar si un nombre está en el texto de consulta. Si el procedimiento hace referencia a una tabla en una sección de comentarios, entonces este resultado no se devolverá en la primera consulta, pero sí en la segunda y otras respuestas proporcionadas.

SELECT t.TABLE_NAME, s.ROUTINE_NAME
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.ROUTINES s ON
    s.ROUTINE_NAME IN (SELECT referencing_entity_name 
        FROM sys.dm_sql_referencing_entities(TABLE_SCHEMA + '.' + TABLE_NAME, 'OBJECT'))
    AND s.ROUTINE_TYPE = 'PROCEDURE'
WHERE t.TABLE_TYPE = 'BASE TABLE'

editar :Aquí se explica cómo obtener las dependencias sin la función. (Me gusta más este método)

SELECT DISTINCT t.name [TableName], p.name [ProcedureName]
FROM sys.objects t 
LEFT JOIN sys.sql_dependencies d ON
    d.referenced_major_id = t.object_id
LEFT JOIN sys.objects p ON
    p.object_id = d.object_id
    AND p.type = 'p'
WHERE t.type = 'u'

Si su uso específico es simplemente encontrar cualquier cadena que coincida con el nombre de una tabla, a continuación funcionará:

SELECT t.TABLE_NAME, s.ROUTINE_NAME 
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.ROUTINES s 
    ON CHARINDEX(t.TABLE_NAME, s.ROUTINE_DEFINITION) > 0
    AND s.ROUTINE_TYPE = 'PROCEDURE'
WHERE t.TABLE_TYPE = 'BASE TABLE'