sql >> Databasteknik >  >> RDS >> Sqlserver

T-SQL:Visa lagrade procedurer relaterade till tabeller, cykliskt

Detta använder informationsschema för både tabeller och lagrade procedurer. Du kan ändra eller ta bort villkoret ROUTINE_TYPE för att lägga till funktioner, och du kan ändra tabelltyp för att returnera vyer.

Detta svar producerar sina resultat genom att kontrollera vilka tabeller en lagrad procedur beror på. Jag tror att detta blir ett mycket mer exakt resultat än att kontrollera om ett namn finns i frågetexten. Om proceduren hänvisar till en tabell i ett kommentarsavsnitt, kommer detta resultat inte att returneras i den första frågan, utan i den andra och andra svar som ges.

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'

redigera :Så här får du beroenden utan funktionen. (Jag gillar den här metoden bäst)

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'

Om din specifika användning är att bara hitta en sträng som matchar ett tabellnamn, kommer nedan att fungera:

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. Det går inte att ladda JDBC-drivrutinsklassen 'com.postgresql.jdbc.Driver'

  2. Flerdimensionell array för att gruppera kategorier och underkategorier

  3. hur kan jag koda en sträng i HMAC-SHA256 med pl/sql?

  4. Varaktighet för data i en global temporär tabell?