You need to enable JavaScript to run this app. SQL Server中如何查找存储过程内调用的所有函数与存储过程
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中如何查找存储过程内调用的所有函数与存储过程

排查指定存储过程内部调用的存储过程、函数的实现方法

做SQL Server对象迁移、存储过程依赖梳理的时候,常需要把单个存储过程内部直接/间接调用的所有其他存储过程、自定义函数全部排查清楚,避免漏迁对象导致运行报错。

可直接落地的查询方案

目前官方推荐通过系统内置的依赖元数据视图查询,结果比老式的sp_depends可靠,不会出现依赖漏记的问题。

查询存储过程的直接调用对象

直接基于sys.sql_expression_dependencies视图筛选目标存储过程的引用关系,能识别所有硬编码在存储过程定义里的存储过程、函数对象:

SELECT
    referenced_schema_name AS 所属架构,
    referenced_entity_name AS 对象名称,
    o.type_desc AS 对象类型,
    referenced_database_name AS 所属数据库
FROM sys.sql_expression_dependencies dep
INNER JOIN sys.objects o
    ON dep.referenced_id = o.object_id
WHERE
    -- 替换为你要排查的存储过程名、对应所属架构
    dep.referencing_entity_name = '你的目标存储过程名'
    AND dep.referencing_schema_name = 'dbo'
    -- 仅保留对象类引用,过滤列、变量这类非目标内容
    AND referenced_entity_name IS NOT NULL

结果说明:返回的对象类型会明确标注是SQL_STORED_PROCEDURE(存储过程)、SQL_SCALAR_FUNCTION(标量值函数)、SQL_TABLE_VALUED_FUNCTION(表值函数),不需要手动做类型判断。

查询全链路嵌套的间接调用对象

如果需要顺着依赖链向下遍历所有嵌套调用的对象(比如目标存储过程A调用了存储过程B,B又调用了函数C,需要把C也纳入结果范围),可以通过递归CTE实现无层级限制的全链路查询:

WITH RecursiveObjectDeps AS (
    -- 锚点:提取目标存储过程的第一层直接依赖
    SELECT
        dep.referenced_id,
        dep.referenced_schema_name,
        dep.referenced_entity_name,
        o.type_desc,
        1 AS 调用层级
    FROM sys.sql_expression_dependencies dep
    INNER JOIN sys.objects o
        ON dep.referenced_id = o.object_id
    WHERE
        dep.referencing_entity_name = '你的目标存储过程名'
        AND dep.referencing_schema_name = 'dbo'
        AND referenced_entity_name IS NOT NULL

    UNION ALL

    -- 递归:沿着每一层依赖继续向下遍历
    SELECT
        dep.referenced_id,
        dep.referenced_schema_name,
        dep.referenced_entity_name,
        o.type_desc,
        rd.调用层级 + 1
    FROM sys.sql_expression_dependencies dep
    INNER JOIN RecursiveObjectDeps rd
        ON dep.referencing_object_id = rd.referenced_id
    INNER JOIN sys.objects o
        ON dep.referenced_id = o.object_id
    WHERE referenced_entity_name IS NOT NULL
)
SELECT DISTINCT * FROM RecursiveObjectDeps

实际使用的避坑提示

  • 遇到带动态SQL的存储过程(比如拼接字符串后通过EXEC执行的逻辑),依赖视图是识别不到动态拼接出的调用对象的,这种场景需要先通过OBJECT_DEFINITION(OBJECT_ID('你的存储过程名'))拿到存储过程的完整定义文本,手动排查动态SQL里拼接的对象名
  • 不要使用已经被微软标记为弃用的sp_depends存储过程、sys.sysdepends旧系统视图,这两类元数据来源很容易出现依赖漏记的问题,尤其是存储过程定义被修改过、或者带WITH RECOMPILE属性的场景,查询结果可信度极低
  • 跨服务器、跨库的链接服务器调用对象,在这套查询逻辑里也能被正常识别,不需要额外写脚本抓取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 04:24:03