本帖最后由 郑全 于 2026-3-25 16:05 编辑
SQL Server 中 sys 架构 与 INFORMATION_SCHEMA 彻底讲清
这两个都是查数据库元数据(表、列、权限、对象)的系统视图,但出身、用途、兼容性、字段完全不同,我用最直白、最实用的方式给你讲透。
一句话核心区别
- sys 架构:SQL Server 原生专用,信息最全、最准、DBA 必用
- INFORMATION_SCHEMA:SQL 标准通用(跨数据库兼容),信息精简、字段少
1. 先搞懂:它们是什么?
① sys 架构(SQL Server 亲儿子)
- 属于 SQL Server 自带系统架构
- 存放所有服务器 + 数据库底层元数据
- 视图名:sys.tables、sys.columns、sys.indexes、sys.sql_logins
- 功能最强:能查权限、锁、执行计划、索引、架构、登录名
- 只能在 SQL Server 用,不能直接迁移到 MySQL/Oracle
② INFORMATION_SCHEMA(SQL 标准通用)
- 属于 ISO SQL 标准(所有数据库都支持这套视图)
- 目的:写一套查询,能在 MySQL、PostgreSQL、Oracle 通用
- 视图名:INFORMATION_SCHEMA.TABLES、COLUMNS
- 缺点:信息少,没有索引、锁、权限、SQL Server 特有属性
2. 超级对比(一眼看懂)
特性 | sys 架构 | INFORMATION_SCHEMA | | SQL Server 专有 | ISO 国际 SQL 标准 | | 跨库兼容 | ❌ 不兼容 | ✅ 全数据库通用 | | 信息完整度 | ✅ 最全(索引、权限、架构、锁) | ❌ 精简(仅表、列、类型) | | 性能 | ✅ 快 | ✅ 快 | | DBA 常用 | ✅ 主力使用 | ❌ 偶尔简单查询 | | 能否查登录名 | ✅ 能(syslogins/sql_logins) | ❌ 不能 | | 能否查索引 | ✅ 能 | ❌ 不能 |
3. 最常用查询对比(实战版)
① 查询所有表
sys 方式(推荐,信息更多)
SELECT name AS 表名 FROM sys.tables;
INFORMATION_SCHEMA 方式(标准通用)
SELECT TABLE_NAME AS 表名
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';
② 查询表的所有列
sys 方式(推荐)
表名 = t.name, 列名 = c.name, 类型 = ty.nameFROM sys.tables tJOIN sys.columns c ON t.object_id = c.object_idJOIN sys.types ty ON c.system_type_id = ty.system_type_id
INFORMATION_SCHEMA 方式(通用)
TABLE_NAME, COLUMN_NAME, DATA_TYPEFROM INFORMATION_SCHEMA.COLUMNS
4. 你到底该用哪个?(超明确建议)
✅ 90% 场景 → 用 sys
- 做 SQL Server 开发、DBA 运维
- 要查索引、权限、架构、登录名、触发器、约束
- 要获取完整、准确、深度信息
✅ 少数场景 → 用 INFORMATION_SCHEMA
- 你的代码要跨数据库兼容(未来可能换 MySQL/Oracle)
- 只做简单查询:表名、列名、字段类型
5. 最关键总结(必记)
- sys = SQL Server 专用、功能强大、DBA 首选
- INFORMATION_SCHEMA = 标准通用、功能简单、跨库用
- 日常工作一律用 sys
- 它们不是竞争关系,而是标准 vs 专有的关系
最终记忆口诀
查深度、查 SQLServer 专属 → sys
跨数据库、简单查询 → INFORMATION_SCHEMA
|