每個 SQL Server 數據庫內部都包含系統表,記錄元數據信息。最常用的兩張:
SELECT name, id
FROM sysobjects
WHERE xtype = 'U' -- U = User Table (用戶表)
ORDER BY name;
常用 xtype 代碼對照:
| 代碼 | 對象類型 | 說明 |
|---|---|---|
| U | User Table | 用戶創建的表 |
| S | System Table | 系統基礎表 |
| V | View | 視圖 |
| P | Stored Procedure | 存儲過程 |
| TR | Trigger | 觸發器 |
| FN | Scalar Function | 標量函數 |
| IF | Inline Table Function | 內聯表值函數 |
| TF | Table Function | 多語句表值函數 |
| PK | Primary Key | 主鍵約束 |
| F | Foreign Key | 外鍵約束 |
| D | Default | 默認約束 |
| C | Check | 檢查約束 |
SELECT name
FROM syscolumns
WHERE id IN (
SELECT id FROM sysobjects
WHERE name = 'YourTableName' AND xtype = 'U'
);
SQL Server 2000+ 推薦使用 ANSI 標準的 INFORMATION_SCHEMA 視圖,不依賴內部系統表結構,跨版本更穩定。
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' -- 僅基礎表,排除視圖
ORDER BY TABLE_NAME;
SELECT
COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
IS_NULLABLE,
COLUMN_DEFAULT,
ORDINAL_POSITION
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName'
ORDER BY ORDINAL_POSITION;
SELECT
表名 = CASE WHEN a.colorder = 1 THEN d.name ELSE '' END,
表說明 = CASE WHEN a.colorder = 1 THEN ISNULL(f.value, '') ELSE '' END,
字段序號 = a.colorder,
字段名 = a.name,
標識列 = CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity') = 1 THEN '√' ELSE '' END,
主鍵 = CASE WHEN EXISTS (
SELECT 1 FROM sysobjects
WHERE xtype = 'PK'
AND name IN (
SELECT name FROM sysindexes
WHERE indid IN (
SELECT indid FROM sysindexkeys
WHERE id = a.id AND colid = a.colid
)
)
) THEN '√' ELSE '' END,
類型 = b.name,
占用字節 = a.length,
長度 = COLUMNPROPERTY(a.id, a.name, 'PRECISION'),
小數位 = ISNULL(COLUMNPROPERTY(a.id, a.name, 'Scale'), 0),
允許空 = CASE WHEN a.isnullable = 1 THEN '√' ELSE '' END,
默認值 = ISNULL(e.text, ''),
字段說明 = ISNULL(g.[value], '')
FROM syscolumns a
LEFT JOIN systypes b ON a.xusertype = b.xusertype
INNER JOIN sysobjects d ON a.id = d.id AND d.xtype = 'U' AND d.name <> 'dtproperties'
LEFT JOIN syscomments e ON a.cdefault = e.id
LEFT JOIN sys.extended_properties g ON a.id = g.major_id AND a.colid = g.minor_id
LEFT JOIN sys.extended_properties f ON d.id = f.major_id AND f.minor_id = 0
WHERE a.id = OBJECT_ID('YourTableName')
ORDER BY a.id, a.colorder;
-- 1. 所有數據庫
SELECT name FROM master..sysdatabases ORDER BY name;
-- 2. 指定庫的所有表
USE YourDB;
SELECT name FROM sysobjects WHERE xtype = 'U' ORDER BY name;
-- 3. 指定表的所有列
SELECT name FROM syscolumns WHERE id = OBJECT_ID('YourTableName');
-- 1. 所有數據庫
SELECT name FROM sys.databases ORDER BY name;
-- 2. 所有表 (含視圖)
SELECT * FROM information_schema.tables;
-- 3. 指定表的所有列
SELECT * FROM information_schema.columns WHERE table_name = 'YourTableName';
DECLARE @db SYSNAME = 'YourDB';
USE @db;
SELECT
'## ' + t.TABLE_NAME + CHAR(13) + CHAR(10) +
'| 列名 | 類型 | 長度 | 允許空 | 默認值 | 說明 |' + CHAR(13) + CHAR(10) +
'|------|------|------|--------|--------|------|' + CHAR(13) + CHAR(10) +
STRING_AGG(
'| ' + c.COLUMN_NAME + ' | ' + c.DATA_TYPE
+ CASE WHEN c.CHARACTER_MAXIMUM_LENGTH IS NOT NULL
THEN '(' + CAST(c.CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')' ELSE '' END
+ ' | ' + ISNULL(CAST(c.CHARACTER_MAXIMUM_LENGTH AS VARCHAR), 'N/A')
+ ' | ' + c.IS_NULLABLE
+ ' | ' + ISNULL(c.COLUMN_DEFAULT, '無')
+ ' | ' + ISNULL(ep.value, '無') + ' |',
CHAR(13) + CHAR(10)
) + CHAR(13) + CHAR(10)
FROM INFORMATION_SCHEMA.TABLES t
JOIN INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME
LEFT JOIN sys.extended_properties ep
ON ep.major_id = OBJECT_ID(t.TABLE_NAME)
AND ep.minor_id = c.ORDINAL_POSITION
AND ep.class = 1
WHERE t.TABLE_TYPE = 'BASE TABLE'
GROUP BY t.TABLE_NAME
ORDER BY t.TABLE_NAME;
註:STRING_AGG 需 SQL Server 2017+,舊版可用 FOR XML PATH 替代。