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
相关产品推荐
相关产品推荐

