查视图依赖需组合使用sys.sql_expression_dependencies和sys.dm_sql_referenced_entities:前者定位依赖表(需object_id+三段式名),后者获取字段级信息(参数必须为'schema.table'+'object');跨库引用、select *、加密对象等场景需人工验证。

直接查 sys.sql_expression_dependencies,但必须配合 sys.dm_sql_referenced_entities 才能拿到完整依赖(表+列),单靠一个视图会漏字段级信息。
查视图依赖的表:用 sys.sql_expression_dependencies 过滤 referencing_id
这是最稳的起点,它基于元数据解析,不依赖字符串匹配,能识别带 schema 前缀、别名、甚至跨库引用(只要写全三段式名)。
- 必须用
OBJECT_ID('schema.viewname')定位视图,不能只传视图名 -
referenced_schema_name和referenced_database_name字段要一起看,跨库引用时后者非空 -
is_ambiguous = 1是危险信号——说明同名列可能被解析到临时表或多个永久表,得人工确认上下文 - 如果视图定义改过但没执行
sp_refreshsqlmodule,这里的数据会滞后,不是实时状态
查视图依赖的具体字段:必须调 sys.dm_sql_referenced_entities
sys.sql_expression_dependencies 只告诉你用了哪张表,不告诉你用了哪些列。要定位字段,得对每个依赖表单独调这个函数。
- 参数必须是三段式名称:
'schema.tablename',不能少 schema,也不能加数据库名 - 第二个参数固定为字符串字面量
'OBJECT',不能传变量,否则报错 - 结果里
is_selected = 1表示该列出现在 SELECT 列表中,is_updated = 1表示被 UPDATE 涉及 - 如果某列在结果里缺失,或者
referenced_minor_id = 0,说明该列可能已不存在或名字不匹配
验证依赖是否还有效:用 sys.dm_exec_describe_first_result_set
查完依赖只是“知道用了什么”,还得确认这些对象现在还能不能正常解析。这个函数模拟执行前的元数据推导,不真正跑 SQL。
- 传入的查询字符串必须可解析,比如
N'SELECT * FROM [db].[schema].[table]',跨库时库名不能省 - 第三个参数设为
0表示只解析、不执行,避免副作用 - 关注返回里的
error_message字段,有值就说明列名失效、类型冲突或权限不足 - 如果视图里有
SELECT *或嵌套 CTE,这一步比单纯查系统视图更可靠
容易被忽略的是:视图本身没加密,但它的依赖对象(比如某个函数)可能被 WITH ENCRYPTION 包裹,这时 sys.dm_sql_referenced_entities 仍能返回表级依赖,但字段级信息会断——你得手动进那个函数体里扒定义。










