应优先使用sys.sql_expression_dependencies反向查询视图被哪些存储过程引用,因其基于元数据解析、支持架构前缀和加密对象,但无法捕获动态sql中的运行时引用。

直接查 sys.sql_expression_dependencies,别用 sp_depends —— 它早就不准了,尤其对带架构名、CTE、窗口函数的引用会漏判或误报。
查视图/函数被哪些存储过程引用
这是最常见需求,核心是反向查“谁引用了我”。sys.sql_expression_dependencies 是唯一推荐方式,它基于元数据解析,不靠字符串匹配:
- 必须用
referenced_entity_name = 'YourViewName'(不能带 schema 前缀,否则可能为空) - 要加
AND o.type IN ('P', 'TR', 'FN', 'IF', 'TF')过滤出存储过程、触发器、各类函数 - 如果视图在
dbo外的 schema,比如sales.V_Customers,仍只写'V_Customers',但需确认该视图名在数据库中唯一;否则可能混入同名不同 schema 的对象 - 加密过的存储过程(
WITH ENCRYPTION)不影响结果,元数据仍注册
示例语句:
SELECT
OBJECT_SCHEMA_NAME(d.referencing_id) AS [Schema],
OBJECT_NAME(d.referencing_id) AS [ObjectName],
o.type_desc AS [ObjectType]
FROM sys.sql_expression_dependencies d
JOIN sys.objects o ON d.referencing_id = o.object_id
WHERE d.referenced_entity_name = 'V_SalesSummary'
AND o.type IN ('P', 'FN', 'IF', 'TF')
AND o.is_ms_shipped = 0
ORDER BY [Schema], [ObjectName];
为什么 sys.dm_sql_referencing_entities 经常查不到?
这个函数看着更直接,但参数格式极其敏感,容易因一个字符错就返回空:
- 第一个参数必须是三段式名称:
'dbo.V_SalesSummary',少 schema 就查不到 - 不能带数据库名:
'AdventureWorks.dbo.V_SalesSummary'会报错 - 第二个参数必须是字符串
'OBJECT',大小写不敏感但拼写不能错 - 调用前需确保当前数据库上下文正确(
USE YourDB),否则可能权限不足或找不到对象
正确写法:
USE YourDB;
SELECT * FROM sys.dm_sql_referencing_entities('dbo.V_SalesSummary', 'OBJECT');
动态 SQL 场景下依赖查不到怎么办?
如果存储过程中用了 EXEC('SELECT * FROM ' + @viewname) 或 sp_executesql 拼接视图名,sys.sql_expression_dependencies 和 sys.dm_sql_referencing_entities 都不会收录——因为编译时根本不知道变量值是什么。
- 这类引用只能靠人工 grep 源码(用
sys.sql_modules提取所有定义后全文搜索视图名) - 注意:搜索时要排除注释干扰,例如
-- SELECT * FROM V_SalesSummary不算真实引用 - 可以用正则匹配
\bFROM\s+V_SalesSummary\b或\bJOIN\s+V_SalesSummary\b,避免匹配到字段名或字符串字面量 - 临时方案:给视图加个唯一注释标记(如
-- DEPENDS_ON: V_SalesSummary),再统一扫描
真正麻烦的是跨库动态引用和加密 + 动态拼接的组合场景,这时候依赖关系本质上已脱离静态分析能力范围,得靠运行时日志或代码治理手段补位。











