利用 sysforeignkeys、sysobjects、syscolumns 系統表,編寫腳本快速獲取指定表的「被引用」與「引用他表」的外鍵詳細信息。
DECLARE @id BIGINT;
SELECT @id = id FROM sysobjects WHERE name = 'd_病人資料庫';
SELECT
a.name AS 被參照表名,
b.rkey AS 被參照列位置,
c.name AS 被參照列名,
b.fkey AS 參照字段本表位置,
d.name AS 參照字段名
FROM sysforeignkeys b
JOIN sysobjects a ON a.id = b.rkeyid
JOIN syscolumns c ON c.id = a.id AND c.colid = b.rkey
JOIN (SELECT name, colid FROM syscolumns WHERE id = @id) d ON d.colid = b.fkey
WHERE b.fkeyid = @id;
SELECT
a.name AS 參照我表名,
c.name AS 列名,
b.fkey AS 參照字段位置,
b.rkey AS 我被參照字段位置,
d.name AS 我被參照字段名
FROM sysforeignkeys b
JOIN sysobjects a ON a.id = b.fkeyid
JOIN syscolumns c ON c.id = a.id AND c.colid = b.fkey
JOIN (SELECT name, colid FROM syscolumns WHERE id = @id) d ON d.colid = b.rkey
WHERE b.rkeyid = @id;
| 字段 | 說明 |
|---|---|
| 被參照表名 / 參照我表名 | 關聯的另一張表 |
| 被參照列位置 / 參照字段位置 | 在對方表中的列序號 (colid) |
| 被參照列名 / 列名 | 對方表的具體列名 |
| 參照字段本表位置 / 我被參照字段位置 | 在本表中的列序號 |
| 參照字段名 / 我被參照字段名 | 本表的具體列名 |
-- 查詢某表所有外鍵詳情
SELECT
OBJECT_NAME(fk.parent_object_id) AS 子表,
COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS 子表列,
OBJECT_NAME(fk.referenced_object_id) AS 父表,
COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) AS 父表列,
fk.name AS 外鍵名,
fk.delete_referential_action_desc AS 刪除動作,
fk.update_referential_action_desc AS 更新動作
FROM sys.foreign_keys fk
JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
WHERE fk.parent_object_id = OBJECT_ID('d_病人資料庫')
OR fk.referenced_object_id = OBJECT_ID('d_病人資料庫');