必须用 referenced_id 反向查询 sys.sql_expression_dependencies,因该视图仅单向记录“谁引用了谁”,查调用方需以目标对象为 referenced_id;sysdepends 在 sql server 2005+ 中不保证完整性,且 alter 后未重编译会导致依赖丢失。

直接查 sys.sql_expression_dependencies,但必须用 referenced_id 反向过滤,否则查不到调用方。
为什么不能用 sysdepends 或正向查依赖?
sysdepends 在 SQL Server 2005+ 中已不保证完整,特别是 ALTER 后未重编译的对象,依赖关系会滞后甚至丢失;而 sys.sql_expression_dependencies 是单向的——它只记录“谁引用了谁”,不是“谁被谁引用”。所以查“谁调用了我”,得把当前存储过程作为被引用对象去搜。
怎么写反向查询语句?
用 OBJECT_ID('dbo.YourProcName') 作为 referenced_id,再关联 sys.objects 获取调用方类型和名称:
SELECT
OBJECT_NAME(d.referencing_id) AS caller_name,
o.type_desc AS caller_type
FROM sys.sql_expression_dependencies d
JOIN sys.objects o ON d.referencing_id = o.object_id
WHERE d.referenced_id = OBJECT_ID('dbo.usp_GetOrderSummary')
AND d.is_ambiguous = 0;
-
caller_type可能是SQL_STORED_PROCEDURE、VIEW、SQL_TRIGGER,甚至SQL_INLINE_TABLE_VALUED_FUNCTION -
is_ambiguous = 0过滤掉因权限不足或名字冲突导致无法解析的引用 - 如果结果为空,先确认调用是否用了动态 SQL(如
EXEC('...'))或拼接对象名——这类引用根本不会进sys.sql_expression_dependencies
查不到时该检查什么权限?
依赖关系能否被记录,取决于调用方对象的 VIEW DEFINITION 权限。没有这个权限,SQL Server 就不会把该对象写入 sys.sql_expression_dependencies。
- 对目标存储过程执行
GRANT VIEW DEFINITION ON dbo.usp_GetOrderSummary TO [user] - 或者让调用方对象的拥有者显式授予
VIEW DEFINITION - 临时表、表变量、未用三段式名(
db.schema.table)的跨库引用,也永远不会出现在这个视图里
真正难搞的是动态 SQL 和权限缺失组合——这两者会让依赖关系彻底“隐身”,只能靠代码扫描或运行时 XEvent 捕获来补位。










