在SQL Server的数据库管理中,存储过程往往会和其他数据库对象产生关联,比如被其他存储过程调用、被视图引用或者被触发器使用。当我们需要修改某个存储过程时,提前了解它的依赖关系能避免误操作导致其他关联对象报错。系统动态管理函数sys.dm_sql_referencing_entities就是专门用于查询指定对象被哪些其他对象引用的工具,能快速帮我们梳理存储过程的依赖情况。

sys.dm_sql_referencing_entities函数基本语法
该函数的语法结构如下:
sys.dm_sql_referencing_entities (
'schema_name.object_name',
'object_type'
)
两个参数的含义分别是:
- schema_name.object_name:要查询的对象的完整名称,包含架构名和对象名,比如dbo.usp_GetUser。
- object_type:要查询的对象的类型,存储过程对应的类型是
OBJECT,如果是其他类型可以对应调整,比如视图是VIEW。
查询存储过程依赖关系的示例
假设我们有一个名为usp_GetOrderList的存储过程,位于dbo架构下,现在要查询哪些对象引用了这个存储过程,可以执行以下SQL语句:
-- 查询引用dbo.usp_GetOrderList的所有对象
SELECT
referencing_schema_name, -- 引用对象的架构名
referencing_entity_name, -- 引用对象的名称
referencing_class_desc, -- 引用对象的类型描述
referenced_schema_name, -- 被引用对象的架构名
referenced_entity_name -- 被引用对象的名称
FROM
sys.dm_sql_referencing_entities('dbo.usp_GetOrderList', 'OBJECT');
执行上述语句后,返回的结果会列出所有引用了dbo.usp_GetOrderList的对象信息,比如如果有另一个存储过程usp_ProcessOrder调用了它,就会在结果中显示该存储过程的名称和类型。
查询结果字段说明
该函数返回的结果包含多个字段,常用的字段含义如下:
| 字段名 | 含义说明 |
|---|---|
| referencing_schema_name | 引用当前对象的对象的架构名称 |
| referencing_entity_name | 引用当前对象的对象的名称 |
| referencing_class_desc | 引用对象的类型描述,比如OBJECT表示对象,VIEW表示视图 |
| referenced_schema_name | 被引用对象的架构名称,也就是我们查询时传入的架构名 |
| referenced_entity_name | 被引用对象的名称,也就是我们查询时传入的对象名 |
注意事项
- 该函数只能查询当前数据库内的对象依赖关系,无法跨数据库查询。
- 如果存储过程是通过动态SQL引用的,可能无法被该函数检测到,因为动态SQL的依赖关系是在运行时才确定的。
- 查询时需要确保当前用户有足够的权限访问系统视图和被查询的对象,否则可能返回空结果或者报错。
其他相关依赖查询方法
如果需要查询存储过程依赖了哪些其他对象,可以使用对应的系统函数sys.dm_sql_referenced_entities,语法和sys.dm_sql_referencing_entities类似,只是参数含义相反,示例如下:
-- 查询dbo.usp_GetOrderList依赖的所有对象
SELECT
referenced_schema_name,
referenced_entity_name,
referenced_class_desc
FROM
sys.dm_sql_referenced_entities('dbo.usp_GetOrderList', 'OBJECT');
另外也可以通过SQL Server Management Studio的图形界面查看依赖关系,右键点击存储过程,选择查看依赖关系,就能看到可视化的依赖关系图,不过图形界面的结果可能不如函数查询的结果灵活,适合快速查看简单场景的依赖情况。
SQL存储过程sys.dm_sql_referencing_entities依赖关系查询修改时间:2026-07-06 08:03:21