不能。sys.dm_exec_describe_first_result_set仅描述查询结果集结构,不解析对象依赖关系;正确方法是查询sys.sql_expression_dependencies结合sys.objects获取视图依赖的表。

sys.dm_exec_describe_first_result_set 能不能查视图依赖的表?
不能。这个函数只描述查询结果集结构,不解析对象依赖关系。它常被误用于判断视图来源表,但实际返回的是执行计划预估的列元数据,和 sys.views 或 sys.sql_modules 里的定义文本无关。
用 sys.dm_exec_describe_first_result_set_for_object 查视图定义是否可靠?
不推荐。虽然它接受 object_id 参数并能解析视图定义,但它本质仍是基于执行计划推导——若视图含动态 SQL、条件分支(如 IF @flag = 1 SELECT FROM t1 ELSE SELECT FROM t2),或引用了尚未创建的对象,结果会不完整甚至报错 Msg 11522。
正确方式:查 sys.sql_expression_dependencies + sys.objects
这是 SQL Server 2008+ 官方推荐的依赖查询路径,直接读取编译时记录的依赖快照。注意以下几点:
-
sys.sql_expression_dependencies中referencing_id是视图的object_id,referenced_id是被引用对象(表/视图/函数)的object_id - 若
referenced_id为NULL,说明引用对象不存在或跨数据库(此时需查referenced_database_name、referenced_schema_name、referenced_entity_name) - 该视图不会实时更新——修改视图后需执行
sp_refreshsqlmodule或重新创建,否则依赖关系可能滞后 - 不识别字符串拼接式引用(如
EXEC('SELECT * FROM ' + @table)),这类只能靠正则扫描sys.sql_modules.definition
SELECT
OBJECT_NAME(d.referencing_id) AS view_name,
ISNULL(OBJECT_NAME(d.referenced_id), d.referenced_entity_name) AS referenced_name,
d.referenced_class_desc
FROM sys.sql_expression_dependencies d
WHERE d.referencing_id = OBJECT_ID('YourViewName')
AND d.referenced_class IN (1, 2); -- 1=object or column, 2=database为什么 sysdepends 已废弃且不准?
sysdepends 在 SQL Server 2005 后就标记为“仅供向后兼容”,其数据来源于旧版编译缓存,不支持新语法(如 CTE、窗口函数、OFFSET-FETCH)、不处理同义词、对跨库引用常返回空。更关键的是:它不区分“直接引用”和“间接引用”,比如视图 A 引用视图 B,B 引用表 C,sysdepends 可能直接把 C 列为 A 的依赖,跳过 B —— 这在排查变更影响范围时极易误导。
依赖关系本身是静态快照,不是运行时拓扑;跨库、加密视图、延迟绑定对象都会让查询结果变“薄”。真要覆盖全部情况,得组合 sys.sql_expression_dependencies、sys.sql_modules 文本扫描、以及手动验证执行计划。

















