如何在SSMS中获取视图/表的全层级依赖对象?
在SSMS中获取视图的多级依赖关系方案
一、正确术语说明
- 依赖对象(Referenced Entities):当前对象(如目标视图)直接或间接引用的下层对象(表、子视图、函数等),你之前提到的“父级/祖父级”属于表述偏差,实际需要追踪的是这类下层依赖链。
- 引用对象(Referencing Entities):引用当前对象的上层对象(比如其他视图调用了目标视图)。
二、SSMS内置可视化功能
1. 查看依赖项窗口
- 操作步骤:在对象资源管理器中找到目标视图 → 右键 → 选择「查看依赖项」
- 在弹出窗口中选择**“依赖于该对象”**标签页,可看到目标视图直接依赖的对象;点击对象前的展开箭头,能逐层查看所有多级嵌套的依赖对象(包括深层表、子视图)。
- 优点:无需写代码,直观可视化;缺点:超大型依赖链展开速度较慢。
2. 数据库关系图
- 操作步骤:在对象资源管理器的「数据库关系图」节点右键 → 新建数据库关系图 → 拖拽目标视图到画布,SSMS会自动加载其直接依赖的对象;继续拖拽依赖对象,可手动扩展完整依赖链。
- 优点:图形化展示依赖关系,便于梳理结构;缺点:需手动操作,适合小范围依赖场景。
三、系统查询(推荐用递归CTE)
使用SQL Server动态管理视图(DMV)sys.dm_sql_referenced_entities结合递归CTE,可一次性查询目标视图的所有多级依赖对象,适合批量或自动化场景:
DECLARE @TargetObjectName NVARCHAR(256) = 'dbo.YourProblemView'; -- 替换为你的目标视图名 WITH DependencyChain AS ( -- 初始层:目标视图直接依赖的对象 SELECT referenced_server_name AS ServerName, referenced_database_name AS DatabaseName, referenced_schema_name AS SchemaName, referenced_entity_name AS EntityName, referenced_id AS EntityID, referenced_minor_id AS MinorID, 1 AS DependencyLevel, @TargetObjectName AS ParentEntity FROM sys.dm_sql_referenced_entities(@TargetObjectName, 'OBJECT') WHERE referenced_entity_name IS NOT NULL UNION ALL -- 递归层:查询依赖对象的依赖项 SELECT r.referenced_server_name, r.referenced_database_name, r.referenced_schema_name, r.referenced_entity_name, r.referenced_id, r.referenced_minor_id, dc.DependencyLevel + 1, dc.EntityName AS ParentEntity FROM DependencyChain dc JOIN sys.dm_sql_referenced_entities( CONCAT(dc.SchemaName, '.', dc.EntityName), 'OBJECT' ) r ON 1=1 WHERE r.referenced_entity_name IS NOT NULL -- 避免循环依赖死循环 AND NOT EXISTS ( SELECT 1 FROM DependencyChain dc2 WHERE dc2.SchemaName = r.referenced_schema_name AND dc2.EntityName = r.referenced_entity_name AND dc2.DependencyLevel <= dc.DependencyLevel ) ) SELECT DependencyLevel, ParentEntity, CONCAT(ISNULL(ServerName + '.', ''), ISNULL(DatabaseName + '.', ''), SchemaName, '.', EntityName) AS FullDependencyPath, -- 识别对象类型 CASE WHEN OBJECT_ID(CONCAT(SchemaName, '.', EntityName)) IS NOT NULL THEN OBJECT_NAME(OBJECT_ID(CONCAT(SchemaName, '.', EntityName))) + ' (' + TYPE_NAME(OBJECT_ID(CONCAT(SchemaName, '.', EntityName))) + ')' ELSE EntityName + ' (External/Unresolved)' END AS ObjectType FROM DependencyChain ORDER BY DependencyLevel, ParentEntity;
- 说明:替换
@TargetObjectName为你的目标视图名,执行后返回所有层级的依赖对象,包含依赖层级、父对象、完整路径和对象类型,自动处理循环依赖避免死循环。
四、系统存储过程
1. sp_depends(旧版,兼容性好但精度有限)
EXEC sp_depends @objname = N'dbo.YourProblemView';
- 说明:返回目标视图直接依赖的对象,但不支持自动递归查询多级依赖,需手动逐层查询;部分场景下可能遗漏加密对象等依赖。
2. sp_MSdependencies(未公开存储过程,谨慎使用)
EXEC sp_MSdependencies @objname = N'dbo.YourProblemView', @flags = 8;
- 说明:
@flags=8表示查询目标对象依赖的所有下层对象(多级),但该存储过程未被微软官方支持,后续SQL Server版本可能移除。
内容的提问来源于stack exchange,提问作者all_your_db_are_belong_to_us
相关产品推荐
相关产品推荐

