開發、文件化、自動化腳本中,常需程式化取得資料表的**主鍵 (PK)**、**外鍵 (FK)** 或**唯一條件約束** 中繼資料。SQL Server 提供系統預存程序 sp_pkeys (主鍵)、sp_fkeys (外鍵)、sp_keys (PK+FK 合併) 以及 ANSI 標準 INFORMATION_SCHEMA 檢視。本文詳細說明參數、回傳欄位、實戰範例與最佳實務。
sp_pkeys
@table_name = 'TableName', -- 必填,資料表名稱
@table_owner = 'SchemaName', -- 選填,預設 dbo
@table_qualifier = 'DatabaseName' -- 選填,預設目前資料庫
| 欄位 | 說明 |
|---|---|
| TABLE_QUALIFIER | 資料庫名稱 |
| TABLE_OWNER | 結構描述擁有者 |
| TABLE_NAME | 資料表名稱 |
| COLUMN_NAME | 主鍵欄位名稱 |
| KEY_SEQ | 欄位在主鍵中的順序 (1 起) |
| PK_NAME | 主鍵條件約束名稱 |
USE Northwind;
GO
EXEC sp_pkeys @table_name = N'Orders', @table_owner = N'dbo', @table_qualifier = N'Northwind';
GO
sp_fkeys
@pktable_name = 'PK_Table', -- 參考目標表 (被參考方)
@pktable_owner = 'Schema',
@pktable_qualifier = 'Database',
@fktable_name = 'FK_Table', -- 外鍵所在表 (參考方)
@fktable_owner = 'Schema',
@fktable_qualifier = 'Database'
若僅提供 @pktable_* → 回傳**參考該表的所有外鍵** (子表)。
若僅提供 @fktable_* → 回傳**該表參考的所有外鍵** (父表)。
| 欄位 | 說明 |
|---|---|
| PKTABLE_QUALIFIER | 父表資料庫 |
| PKTABLE_OWNER | 父表結構描述 |
| PKTABLE_NAME | 父表名稱 |
| PKCOLUMN_NAME | 父表參考欄位 |
| FKTABLE_QUALIFIER | 子表資料庫 |
| FKTABLE_OWNER | 子表結構描述 |
| FKTABLE_NAME | 子表名稱 |
| FKCOLUMN_NAME | 子表外鍵欄位 |
| KEY_SEQ | 欄位順序 |
| UPDATE_RULE | 更新規則 (CASCADE/NO ACTION...) |
| DELETE_RULE | 刪除規則 |
| FK_NAME | 外鍵條件約束名稱 |
EXEC sp_keys @table_name = 'Orders', @table_owner = 'dbo', @table_qualifier = 'Northwind';
回傳欄位同 sp_pkeys,但會同時包含該表作為子表的外鍵資訊 (PKTABLE/FKTABLE 混合)。
系統預存程序屬 Microsoft 專有,**INFORMATION_SCHEMA** 為 ANSI SQL 標準,跨資料庫平台可移植性更佳。
SELECT
TC.CONSTRAINT_CATALOG, -- 資料庫
TC.CONSTRAINT_SCHEMA, -- 結構描述
TC.TABLE_NAME,
KCU.COLUMN_NAME,
KCU.ORDINAL_POSITION, -- KEY_SEQ 對應
KCU.CONSTRAINT_NAME -- PK_NAME 對應
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU
ON TC.TABLE_NAME = KCU.TABLE_NAME
AND TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME
WHERE TC.TABLE_NAME = N'Orders'
AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY';
SELECT
RC.CONSTRAINT_CATALOG,
RC.CONSTRAINT_SCHEMA,
RC.TABLE_NAME AS FK_TABLE,
KCU.COLUMN_NAME AS FK_COLUMN,
RC.UNIQUE_CONSTRAINT_CATALOG AS PK_CATALOG,
RC.UNIQUE_CONSTRAINT_SCHEMA AS PK_SCHEMA,
RC.UNIQUE_CONSTRAINT_NAME AS PK_CONSTRAINT,
CCU.TABLE_NAME AS PK_TABLE,
CCU.COLUMN_NAME AS PK_COLUMN,
RC.DELETE_RULE,
RC.UPDATE_RULE
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU
ON RC.CONSTRAINT_CATALOG = KCU.CONSTRAINT_CATALOG
AND RC.CONSTRAINT_SCHEMA = KCU.CONSTRAINT_SCHEMA
AND RC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU
ON RC.UNIQUE_CONSTRAINT_CATALOG = CCU.CONSTRAINT_CATALOG
AND RC.UNIQUE_CONSTRAINT_SCHEMA = CCU.CONSTRAINT_SCHEMA
AND RC.UNIQUE_CONSTRAINT_NAME = CCU.CONSTRAINT_NAME
WHERE KCU.TABLE_NAME = N'Order Details'; -- 子表
生產環境自動化腳本建議直接查詢 sys.* 目錄檢視,避免 INFORMATION_SCHEMA 視圖的效能開銷與鎖定爭用。
SELECT
OBJECT_SCHEMA_NAME(i.object_id) AS SchemaName,
OBJECT_NAME(i.object_id) AS TableName,
i.name AS IndexName,
i.type_desc AS IndexType,
c.name AS ColumnName,
ic.key_ordinal AS KeySeq,
ic.is_descending_key,
ic.is_included_column
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.is_primary_key = 1
AND OBJECT_NAME(i.object_id) = 'Orders';
SELECT
OBJECT_SCHEMA_NAME(fk.parent_object_id) AS FK_Schema,
OBJECT_NAME(fk.parent_object_id) AS FK_Table,
fk.name AS FK_Name,
COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS FK_Column,
OBJECT_SCHEMA_NAME(fk.referenced_object_id) AS PK_Schema,
OBJECT_NAME(fk.referenced_object_id) AS PK_Table,
COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) AS PK_Column,
fk.delete_referential_action_desc AS DeleteRule,
fk.update_referential_action_desc AS UpdateRule
FROM sys.foreign_keys fk
JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
WHERE OBJECT_NAME(fk.parent_object_id) = 'Order Details';
| 場景 | 推薦方式 | 理由 |
|---|---|---|
| 快速互動查詢 (SSMS) | sp_pkeys / sp_fkeys | 簡短、記憶體友善、輸出格式固定 |
| 跨平台腳本/文件產生器 | INFORMATION_SCHEMA | ANSI 標準、可移植 |
| 高頻自動化/大量中繼資料掃描 | sys.indexes / sys.foreign_keys | 效能最佳、資訊最完整 (含篩選索引、壓縮、資料空間等) |
| 需要條件約束規則 (CASCADE/NO ACTION) | sp_fkeys 或 sys.foreign_keys | sp_pkeys 不含規則資訊 |
sp_pkeys、sp_fkeys、sp_keys 是 SQL Server 獨有的便捷工具,適合臨時查詢與簡單腳本。建立企業級中繼資料字典、自動化部署管線、跨平台工具時,請優先採用 INFORMATION_SCHEMA 或 sys.* 目錄檢視,確保標準相容與執行效能。