应优先使用sys.sql_expression_dependencies查视图依赖的物理表,因其基于编译时元数据快照,能准确识别架构前缀、别名等静态引用,但无法捕获动态sql拼接的运行时引用;跨库引用需解析referenced_database_name等字段,动态sql则须人工检查sys.sql_modules.definition。

直接查 INFORMATION_SCHEMA.COLUMNS 只能拿到视图自身的列定义,看不到它背后真实表的字段类型、长度、是否可空等原始结构——这会导致你误判数据来源或写错下游逻辑。必须拆开视图定义,定位到实际被引用的物理表,再查那些表的 sys.columns 或 INFORMATION_SCHEMA.COLUMNS。
用 sys.sql_expression_dependencies 找出视图真正依赖哪些表
这是唯一可靠的方式,因为它是 SQL Server 编译视图时记录的真实依赖快照,不依赖运行时推导。
-
referencing_id是视图的object_id,referenced_id是被引用对象(如基表)的object_id - 如果
referenced_id为NULL,说明引用跨库(比如OtherDB.dbo.TableX),此时要读referenced_database_name、referenced_schema_name、referenced_entity_name - 修改视图后,依赖关系不会自动更新,必须手动执行
sp_refreshsqlmodule 'YourViewName'或重建视图 - 完全不识别字符串拼接式引用(如
'SELECT * FROM ' + @tbl),这种只能扫sys.sql_modules.definition配合正则提取
示例查询:
SELECT
OBJECT_NAME(d.referencing_id) AS view_name,
ISNULL(OBJECT_NAME(d.referenced_id), d.referenced_entity_name) AS referenced_name,
d.referenced_database_name,
d.referenced_schema_name,
d.referenced_class_desc
FROM sys.sql_expression_dependencies d
WHERE d.referencing_id = OBJECT_ID('YourViewName')
AND d.referenced_class IN (1, 2); -- 1=object/column, 2=database
查出基表后,用 sys.columns 获取真实字段结构
拿到表名(含库名、Schema)后,不能直接查视图的列信息,得查物理表本身的列定义——这才是源头结构。
-
sys.columns提供字段名、数据类型 ID、最大长度、精度、是否可空、是否标识列等关键信息 - 需关联
sys.types才能拿到人类可读的类型名(如int、varchar),否则只有system_type_id -
max_length对varchar是字节数,对nvarchar是字节数(不是字符数),precision/scale对decimal才有意义 - 别用
INFORMATION_SCHEMA.COLUMNS查物理表结构——它在跨库引用时可能返回空或错误,且不暴露is_identity、is_computed等细节
示例(查某张基表):
SELECT
c.name AS column_name,
t.name AS data_type,
c.max_length,
c.precision,
c.scale,
c.is_nullable,
c.is_identity
FROM sys.columns c
JOIN sys.types t ON c.system_type_id = t.system_type_id
WHERE c.object_id = OBJECT_ID('dbo.YourBaseTable');
为什么 sys.dm_exec_describe_first_result_set_for_object 不行
这个函数看起来专为视图设计,但底层走的是执行计划预估路径,一碰复杂逻辑就失效。
- 视图里有
IF分支(如IF @mode = 1 SELECT FROM t1 ELSE SELECT FROM t2),它只返回某一分支的结果结构,漏掉另一半 - 引用尚未创建的表或跨库对象(如
OtherDB.dbo.MissingTable),直接报错Msg 11522 - 含动态 SQL(
EXEC('SELECT * FROM ' + @tbl))时完全无法识别,返回空或错误 - 对 CTE、窗口函数、计算列支持不稳定,依赖的快照可能已过期
它只推导“结果集结构”,不是“真实引用关系”。想查依赖,它连门槛都达不到。
别碰 sysdepends,它已被废弃且结果不可信
sysdepends 在 SQL Server 2005 就标记为“向后兼容”,2008 后不再维护。它的依赖记录靠触发器维护,极易丢失或错乱,尤其在重命名、跨库引用、视图嵌套场景下。
官方文档明确要求停用,所有新代码必须用 sys.sql_expression_dependencies 替代。哪怕旧系统还在用,也别把它当依据——它返回的 id 和 depid 字段早已不反映真实对象关系。
真正麻烦的点不在查询语句本身,而在于跨库引用和动态拼接:前者需要手动解析 referenced_database_name 并切换上下文查表结构,后者根本无法自动化——只能人工翻 sys.sql_modules.definition 里的原始文本。这两类情况,工具无解,得靠人盯。











