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

T-SQL:Vis lagrede procedurer relateret til tabeller, cyklisk

Dette bruger informationsskema til både tabeller og lagrede procedurer. Du kan ændre eller fjerne ROUTINE_TYPE-tilstand for at tilføje funktioner, og du kan ændre tabeltype for at returnere visninger.

Dette svar producerer sine resultater ved at kontrollere, hvilke tabeller en lagret procedure afhænger af. Jeg tror, ​​at dette vil være et meget mere præcist resultat end at kontrollere, om et navn er i forespørgselsteksten. Hvis proceduren refererer til en tabel i et kommentarsektion, vil dette resultat ikke blive returneret i den første forespørgsel, men vil være i den anden og andre svar.

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'

rediger :Sådan får du afhængighederne uden funktionen. (Jeg kan bedst lide denne metode)

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'

Hvis din specifikke brug er at finde en streng, der matcher et tabelnavn, vil nedenstående virke:

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. SQLite3 og Postgres/Heroku Ruby on Rails Query problemer

  2. Hvordan kan jeg bruge OR condition i MySQL CASE udtryk?

  3. Sådan henter du vært, port, sid, bruger og adgangskodeoplysninger i java.sql.Connection

  4. Hvordan integrerer man PostgreSql med EntityFramework 6.0.2?