You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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依赖追踪器可能会包含触发器这类对象的关联关系。
  • 对象名称解析逻辑差异

    • sys.sql_expression_dependencies依赖编译时的架构上下文,如果对象使用非限定名称(如仅写titles而非dbo.titles),可能因默认架构设置导致追踪不全。
    • UI依赖追踪器会在查询时尝试实时解析名称,覆盖更多非限定名称的场景。
  • 缓存时效性差异

    • sys.sql_expression_dependencies的数据依赖对象的编译缓存,若对象修改后未重新编译,视图数据可能过时。
    • UI依赖追踪器通常会实时刷新缓存,结果更贴近当前对象的实际依赖状态。

验证与对齐方法

  1. 递归查询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;
    
  2. 检查UI结果中是否包含触发器、临时表相关依赖,这类是sys.sql_expression_dependencies的盲区,需单独查询sys.triggers等视图补充。
  3. 执行sp_refreshsqlmodule刷新指定对象的依赖缓存后,重新查询sys.sql_expression_dependencies,验证结果是否与UI对齐。

内容的提问来源于stack exchange,提问作者Rod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:33:15