問題背景
MySQL/Oracle 習慣用 DESC table_name,但在 SQL Server 執行 DESC Student 會報錯:「'DESC' 附近有語法錯誤」。
方法一:sp_help (推薦,資訊最完整)
EXEC sp_help 'Student';
-- 或
sp_help Student;
輸出結果包含 (多個結果集)
- 物件基本資訊:名稱、擁有者、建立日期、類型
- 欄位定義:名稱、型別、長度、精度、小數位、允許 NULL、預設值、Identity
- 身分識別欄位:種子、遞增、非複寫
- 索引資訊:名稱、類型 (叢集/非叢集)、唯一性、欄位、填滿因子
- 約束資訊:PK、FK、CHECK、DEFAULT、名稱、欄位、啟用狀態
- 參考此表的 FK:子表名、FK 名、父欄位、子欄位、更新/刪除規則
- 擴充屬性:MS_Description 等說明文字
方法二:sp_columns (專注欄位定義)
EXEC sp_columns 'Student';
-- 或
sp_columns Student;
輸出欄位
| 欄位名 | 說明 |
| COLUMN_NAME | 欄位名稱 |
| TYPE_NAME | 資料類型名稱 |
| PRECISION | 精度 |
| LENGTH | 長度 (bytes) |
| SCALE | 小數位數 |
| NULLABLE | 是否允許 NULL (1=是, 0=否) |
| COLUMN_DEF | 預設值定義 |
| IS_AUTOINCREMENT | 是否 Identity |
現代替代:目錄檢視查詢 (可程式化、可篩選)
-- 完整欄位定義
SELECT
c.name AS ColumnName,
t.name AS DataType,
c.max_length,
c.precision,
c.scale,
c.is_nullable,
c.is_identity,
c.column_id,
dc.definition AS DefaultConstraint
FROM sys.columns c
JOIN sys.types t ON c.user_type_id = t.user_type_id
LEFT JOIN sys.default_constraints dc ON c.default_object_id = dc.object_id
WHERE c.object_id = OBJECT_ID('dbo.Student')
ORDER BY c.column_id;
-- 索引資訊
SELECT
i.name AS IndexName,
i.type_desc,
i.is_unique,
i.is_primary_key,
STRING_AGG(c.name, ', ') WITHIN GROUP (ORDER BY ic.key_ordinal) AS Columns
FROM sys.indexes i
JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE i.object_id = OBJECT_ID('dbo.Student')
GROUP BY i.name, i.type_desc, i.is_unique, i.is_primary_key;
比較建議
| 方法 | 優點 | 缺點 | 適用場景 |
| sp_help | 資訊最完整、一鍵取得所有中繼資料 | 多結果集、難以程式化處理 | 人工查看、快速了解表結構 |
| sp_columns | 專注欄位、輸出單一結果集 | 無索引/約束資訊 | 需程式化處理欄位定義 |
| 目錄檢視 | 完全可控、可篩選、可 JOIN、效能最好 | 需撰寫查詢 | 工具開發、自動化腳本、詳細分析 |