查SQL Server视图元数据应优先使用sys.views,因其字段完整、权限行为明确,包含is_schema_bound等运维关键属性,而sys.objects和INFORMATION_SCHEMA.VIEWS存在字段缺失或过滤不一致问题。

查 SQL Server 视图元数据,优先用 sys.views,不是 sys.objects 或 INFORMATION_SCHEMA.VIEWS —— 前者字段完整、权限行为明确;后两者要么缺关键属性,要么过滤逻辑不一致。
查视图定义和基础属性必须用 sys.views
它专为视图设计,包含 is_ms_shipped(是否系统自带)、is_replicated、is_schema_bound 等真实运维所需字段。直接联查 sys.schemas 就能拿到完整三段式名称:
SELECT SCHEMA_NAME(v.schema_id) AS schema_name, v.name AS view_name, v.create_date, v.modify_date, v.is_schema_bound FROM sys.views v;
-
sys.objects虽然也能WHERE type = 'V'筛出视图,但缺失is_schema_bound这类视图特有属性,且混在所有对象中,容易误读 -
INFORMATION_SCHEMA.VIEWS不暴露创建/修改时间、绑定状态、加密标识等,连VIEW_DEFINITION字段都可能为空(尤其加密视图) - 权限方面:
sys.views对非db_owner用户自动过滤无权访问的视图;而sys.objects在某些版本中会返回行但字段为空,造成误判
查视图的列定义得联查 sys.columns + sys.views
sys.columns 不区分表或视图,只认 object_id。所以必须先确认视图的 object_id,再查其列:
SELECT c.name, TYPE_NAME(c.system_type_id) AS data_type, c.max_length, c.is_nullable, c.is_computed FROM sys.columns c INNER JOIN sys.views v ON c.object_id = v.object_id WHERE v.name = 'MyView';
- 别用
INFORMATION_SCHEMA.COLUMNS查视图列——它对计算列、标识列、加密列的支持极弱,IS_NULLABLE字段还可能返回'YES'即使列定义为NOT NULL -
sys.columns的is_computed和is_nullable是真实值,可直接用于生成建模脚本或校验逻辑 - 若视图含
SELECT *或引用其他视图,列元数据仍来自底层实际对象,sys.columns不做推导,这点必须心里有数
查视图是否加密或已编译,看 OBJECTPROPERTYEX 函数
sys.views 本身不存“是否加密”字段,得靠函数补全:
SELECT name, OBJECTPROPERTYEX(OBJECT_ID(name), 'IsEncrypted') AS is_encrypted, OBJECTPROPERTYEX(OBJECT_ID(name), 'IsSchemaBound') AS is_schema_bound FROM sys.views;
-
OBJECTPROPERTYEX比OBJECTPROPERTY多支持几十种属性,比如'IsAnsiNullsOn'、'IsQuotedIdentOn',这些影响视图重编译行为 - 注意:加密视图的定义无法通过
sys.sql_modules获取,definition字段为空,此时只能靠OBJECTPROPERTYEX(..., 'IsEncrypted')判断存在性 - 该函数返回
1/0,不是字符串,别在 WHERE 中写成= '1'
真正麻烦的点不在查什么表,而在「权限边界」和「定义可见性」——同一个 SELECT * FROM sys.views,db_datareader 角色用户看到的行数可能比 db_owner 少一半,且不会报错,只会静默过滤。如果脚本要跑在多角色环境里,务必提前验证权限上下文,而不是只测自己账号。

















