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

T-SQL:Mostrar procedimentos armazenados relacionados a tabelas, ciclicamente


Isso usa esquema de informações para ambas as tabelas e procedimentos armazenados. Você pode alterar ou eliminar a condição ROUTINE_TYPE para adicionar funções e pode alterar o tipo de tabela para retornar visualizações.

Essa resposta produz seus resultados verificando de quais tabelas um procedimento armazenado depende. Acho que esse será um resultado muito mais preciso do que verificar se um nome está no texto da consulta. Se o procedimento se referir a uma tabela em uma seção de comentários, esse resultado não será retornado na primeira consulta, mas estará na segunda e em outras respostas dadas.
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 :Veja como obter as dependências sem a função. (Eu gosto deste método o melhor)
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'

Se o seu uso específico é apenas encontrar qualquer string que corresponda a um nome de tabela, abaixo 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'