SQL Server 2016中UI依赖追踪与sys.sql_expression_dependencies结果不一致原因
SQL Server 2016中UI依赖追踪器与sys.sql_expression_dependencies结果差异的原因
核心差异来源
追踪范围不同
- UI依赖追踪器(SSMS内置的依赖项查看器)会自动识别间接依赖,比如通过视图、存储过程间接引用titles表的对象,部分场景下还会展示跨数据库/服务器的关联依赖。
sys.sql_expression_dependencies仅记录编译时解析的直接依赖,不会自动展开多层间接依赖,也无法追踪动态SQL中字符串拼接式的模糊引用。
动态SQL与特殊对象的处理差异
- 两者均难以完全识别动态SQL中的表引用,但UI依赖追踪器可能通过静态分析匹配部分模式;
sys.sql_expression_dependencies仅能识别sp_executesql参数化引用这类规范写法的动态依赖。 sys.sql_expression_dependencies不追踪临时表、表变量、触发器对表的依赖,也忽略未编译的对象(比如创建后从未执行过的存储过程);UI依赖追踪器可能会包含触发器这类对象的关联关系。
- 两者均难以完全识别动态SQL中的表引用,但UI依赖追踪器可能通过静态分析匹配部分模式;
对象名称解析逻辑差异
sys.sql_expression_dependencies依赖编译时的架构上下文,如果对象使用非限定名称(如仅写titles而非dbo.titles),可能因默认架构设置导致追踪不全。- UI依赖追踪器会在查询时尝试实时解析名称,覆盖更多非限定名称的场景。
缓存时效性差异
sys.sql_expression_dependencies的数据依赖对象的编译缓存,若对象修改后未重新编译,视图数据可能过时。- UI依赖追踪器通常会实时刷新缓存,结果更贴近当前对象的实际依赖状态。
验证与对齐方法
- 递归查询
sys.sql_expression_dependencies以覆盖间接依赖,对比UI结果:WITH RecursiveDeps AS ( SELECT referencing_id, SCHEMA_NAME(o.schema_id) AS referencing_schema, o.name AS referencing_object, referenced_id, referenced_schema_name, referenced_entity_name FROM sys.sql_expression_dependencies d JOIN sys.objects o ON d.referencing_id = o.object_id WHERE referenced_entity_name = 'titles' UNION ALL SELECT d.referencing_id, SCHEMA_NAME(o.schema_id) AS referencing_schema, o.name AS referencing_object, d.referenced_id, d.referenced_schema_name, d.referenced_entity_name FROM sys.sql_expression_dependencies d JOIN sys.objects o ON d.referencing_id = o.object_id JOIN RecursiveDeps rd ON d.referenced_id = rd.referencing_id ) SELECT DISTINCT referencing_schema, referencing_object FROM RecursiveDeps; - 检查UI结果中是否包含触发器、临时表相关依赖,这类是
sys.sql_expression_dependencies的盲区,需单独查询sys.triggers等视图补充。 - 执行
sp_refreshsqlmodule刷新指定对象的依赖缓存后,重新查询sys.sql_expression_dependencies,验证结果是否与UI对齐。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

