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'