Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

T-SQL:mostra le procedure memorizzate relative alle tabelle, ciclicamente

Questo utilizza lo schema delle informazioni sia per le tabelle che per le stored procedure. Puoi modificare o eliminare la condizione ROUTINE_TYPE per aggiungere funzioni e puoi modificare il tipo di tabella per restituire le viste.

Questa risposta produce i suoi risultati controllando da quali tabelle dipende una stored procedure. Penso che questo sarà un risultato molto più accurato del controllo se nel testo della query è presente un nome. Se la procedura fa riferimento a una tabella in una sezione di commento, questo risultato non verrà restituito nella prima query, ma sarà nella seconda e in altre risposte fornite.

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'

modifica :ecco come ottenere le dipendenze senza la funzione. (Mi piace di più questo metodo)

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 il tuo uso specifico è quello di trovare qualsiasi stringa che corrisponda al nome di una tabella, di seguito funzionerà:

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'