ต่อไปนี้เป็นคำค้นหาทั่วไปเพื่อจับคู่คีย์ต่างประเทศกับตาราง / คอลัมน์ที่อ้างอิง:
SELECT
o1.name AS FK_table,
c1.name AS FK_column,
fk.name AS FK_name,
o2.name AS PK_table,
c2.name AS PK_column,
pk.name AS PK_name,
fk.delete_referential_action_desc AS Delete_Action,
fk.update_referential_action_desc AS Update_Action
FROM sys.objects o1
INNER JOIN sys.foreign_keys fk
ON o1.object_id = fk.parent_object_id
INNER JOIN sys.foreign_key_columns fkc
ON fk.object_id = fkc.constraint_object_id
INNER JOIN sys.columns c1
ON fkc.parent_object_id = c1.object_id
AND fkc.parent_column_id = c1.column_id
INNER JOIN sys.columns c2
ON fkc.referenced_object_id = c2.object_id
AND fkc.referenced_column_id = c2.column_id
INNER JOIN sys.objects o2
ON fk.referenced_object_id = o2.object_id
INNER JOIN sys.key_constraints pk
ON fk.referenced_object_id = pk.parent_object_id
AND fk.key_index_id = pk.unique_index_id
ORDER BY o1.name, o2.name, fkc.constraint_column_id
เอาต์พุตมีแปดคอลัมน์: ชื่อตารางและคอลัมน์สำหรับ foreign key (FK_table, FK_column), ชื่อของข้อ จำกัด foreign-key (FK_name), PK ที่อ้างอิงหรือตารางดัชนีเฉพาะและชื่อคอลัมน์ (PK_table, PK_column) ชื่อของ PK ที่อ้างอิงหรือดัชนีที่ไม่ซ้ำกัน (PK_name) และการดำเนินการอัพเดต / ลบทั้งหมด (Delete_Action, Update_Action)
(แก้ไขเพื่อเพิ่มคอลัมน์เอาต์พุตเพิ่มเติม)
แก้ไข:ฉันกลับมาอีก 6 ปีในภายหลังด้วยการปรับปรุงนี้ ฉันรู้ว่าข้อความค้นหาดั้งเดิมไม่สามารถจัดการกับคีย์ต่างประเทศหลายคอลัมน์ได้ดีและฉันก็ต้องการที่จะสามารถระบุได้อย่างรวดเร็วปิดการใช้งานไม่น่าเชื่อถือหรือไม่ได้คีย์ต่างประเทศ ดังนั้นนี่คือเวอร์ชั่นใหม่ที่สามารถแก้ไขทั้งหมดได้
ปุ่มหลายคอลัมน์จะแสดงเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคในFK_columns
และPK_columns
โดยใช้แบบดั้งเดิมFOR XML
/ STUFF
การละเมิด FK_indexes
แสดงชื่อคอลัมน์ของดัชนีใด ๆ บนโต๊ะต่างประเทศที่สำคัญที่อาจนำมาใช้เพื่อตอบสนองความพยายามใช้คอลัมน์คีย์ต่างประเทศ (ส่วนใหญ่สำหรับการเพิ่มประสิทธิภาพการลบหรือการปรับปรุงตารางคีย์หลัก) ถ้าเป็นNULL
เช่นนั้นคุณมีรหัสต่างประเทศที่ไม่ได้ทำดัชนี คุณสามารถปรับแต่งORDER BY
หรือเพิ่มส่วนWHERE
คำสั่ง (ใส่ความเห็นด้านล่าง) หากคุณต้องการเรียงลำดับตามชื่อตาราง PK ตัวกรองสำหรับตาราง PK / FK เฉพาะเป็นต้น
SELECT
fk.is_disabled,
fk.is_not_trusted,
OBJECT_SCHEMA_NAME(o1.object_id) AS FK_schema,
o1.name AS FK_table,
--Generate list of columns in referring side of foreign key
STUFF(
(
SELECT ', ' + c1.name AS [text()]
FROM sys.columns c1 INNER
JOIN sys.foreign_key_columns fkc
ON c1.object_id = fkc.parent_object_id
AND c1.column_id = fkc.parent_column_id
WHERE fkc.constraint_object_id = fk.object_id
FOR XML PATH('')
), 1, 2, '') AS FK_columns,
--Look for any indexes that will fully satisfy the foreign key columns
STUFF(
(
SELECT ', ' + i.name AS [text()]
FROM sys.indexes i
WHERE i.object_id = o1.object_id
AND NOT EXISTS ( --Find foreign key columns that don't match the index key columns
SELECT fkc.constraint_column_id, fkc.parent_column_id
FROM sys.foreign_key_columns fkc
WHERE fkc.constraint_object_id = fk.object_id
EXCEPT
SELECT ic.key_ordinal, ic.column_id
FROM sys.index_columns ic
WHERE ic.object_id = i.object_id AND ic.index_id = i.index_id
)
FOR XML PATH('')
), 1, 2, '') AS FK_indexes,
fk.name AS FK_name,
OBJECT_SCHEMA_NAME(o2.object_id) AS PK_schema,
o2.name AS PK_table,
--Generate list of columns in referenced (i.e. PK) side of foreign key
STUFF(
(
SELECT ', ' + c2.name AS [text()]
FROM sys.columns c2
INNER JOIN sys.foreign_key_columns fkc
ON c2.object_id = fkc.referenced_object_id
AND c2.column_id = fkc.referenced_column_id
WHERE fkc.constraint_object_id = fk.object_id
FOR XML PATH('')
), 1, 2, '') AS PK_columns,
pk.name AS PK_name,
fk.delete_referential_action_desc AS Delete_Action,
fk.update_referential_action_desc AS Update_Action
FROM sys.objects o1
INNER JOIN sys.foreign_keys fk
ON o1.object_id = fk.parent_object_id
INNER JOIN sys.objects o2
ON fk.referenced_object_id = o2.object_id
INNER JOIN sys.key_constraints pk
ON fk.referenced_object_id = pk.parent_object_id
AND fk.key_index_id = pk.unique_index_id
--WHERE o2.name = 'Company_Address'
ORDER BY o1.name, o2.name