sql >> Database >  >> RDS >> Sqlserver

T-SQL:Toon opgeslagen procedures gerelateerd aan tabellen, cyclisch

Dit maakt gebruik van een informatieschema voor zowel tabellen als opgeslagen procedures. U kunt de ROUTINE_TYPE-voorwaarde wijzigen of verwijderen om functies toe te voegen, en u kunt het tabeltype wijzigen om weergaven terug te geven.

Dit antwoord levert zijn resultaten op door te controleren van welke tabellen een opgeslagen procedure afhankelijk is. Ik denk dat dit een veel nauwkeuriger resultaat zal zijn dan controleren of een naam in de vraagtekst staat. Als de procedure verwijst naar een tabel in een commentaargedeelte, wordt dit resultaat niet geretourneerd in de eerste vraag, maar wel in de tweede en andere antwoorden.

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'

bewerken :Hier leest u hoe u de afhankelijkheden kunt krijgen zonder de functie. (Ik vind deze methode het beste)

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'

Als uw specifieke gebruik is om gewoon een tekenreeks te vinden die overeenkomt met een tabelnaam, werkt het onderstaande:

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'


  1. sql - ORA-00937:geen groepsfunctie voor één groep

  2. Postgres waar clausule tijdstempel vergelijkt

  3. Een inner join met SqlAlchemy

  4. Docker Compose connect ECONNREFUSED 172.18.0.4:3306