sys.dm_sql_referencing_entities查谁依赖指定对象,需用'schema.name'格式和'OBJECT'字面量参数,权限不足或对象不存在时静默返回空;与sys.dm_sql_referenced_entities作用相反,且均不捕获动态SQL引用。

直接查依赖,用 sys.dm_sql_referencing_entities 是最准的——但它查的是“谁依赖这个存储过程”,不是“这个存储过程依赖谁”。别搞反了。
为什么 sys.dm_sql_referencing_entities 返回空或报错
这个函数只返回「引用目标对象」的实体,比如你传入一个存储过程名,它找的是哪些视图、函数、其他存储过程在定义里显式调用了它。常见踩坑点:
- 传参格式必须是
'schema_name.procedure_name',不能只写'procedure_name'(哪怕在 dbo 下) - 第二个参数必须是字符串字面量:
'OBJECT',不能是变量或拼接结果 - 当前用户对目标存储过程没有
VIEW DEFINITION权限时,会静默返回空行(不是报错) - 如果目标过程不存在,或 schema 名写错,函数不报错,但结果集为空
sys.dm_sql_referencing_entities 的典型用法
假设你要查 dbo.usp_GetOrderSummary 被哪些对象引用,执行:
SELECT
referencing_schema_name,
referencing_entity_name,
referencing_class_desc
FROM sys.dm_sql_referencing_entities('dbo.usp_GetOrderSummary', 'OBJECT');
注意:
- 结果中
referencing_class_desc为OBJECT表示是表/视图/存储过程等;DATABASE_DDL_TRIGGER表示数据库级 DDL 触发器也引用了它 - 该函数不返回跨数据库引用(比如另一个库里的视图引用了本库的这个过程),那些得靠
sys.sql_expression_dependencies扫描 - 它不会告诉你调用链深度,比如 A → B → C,你只看到 A 和 B 引用了 C,看不到 B 是中间层
和 sys.dm_sql_referenced_entities 别混用
名字太像,作用完全相反:
-
sys.dm_sql_referenced_entities('dbo.usp_GetOrderSummary', 'OBJECT'):查这个存储过程内部用了哪些表、视图、函数(即它依赖谁) -
sys.dm_sql_referencing_entities('dbo.usp_GetOrderSummary', 'OBJECT'):查谁在代码里写了EXEC dbo.usp_GetOrderSummary或类似引用(即谁依赖它)
权限要求也不同:sys.dm_sql_referencing_entities 要求对被引用过程有 VIEW DEFINITION,而 sys.dm_sql_referenced_entities 还额外需要对被引用对象(比如某张表)也有 VIEW DEFINITION,否则列信息可能缺失。
真正容易被忽略的是:这两个函数都只捕获「静态解析到的依赖」,如果过程里用 EXEC(@sql) 拼接字符串调用别的对象,那些动态引用根本不会出现在结果里——这种只能靠搜索代码或日志回溯。










