Ако трябва да върнете всички външни ключове, които препращат към дадена таблица в SQL Server, опитайте един от следните методи.
Първият метод отправя заявка към sys.foreign_keys
системен изглед. Вторият метод изпълнява sp_fkeys
системна съхранена процедура.
Опция 1 – sys.foreign_keys
Следният код извлича всички външни ключове, които препращат към дадена таблица, заедно с първичния ключ и таблиците с външни ключове. Включвам и схемата за таблиците с външни ключове.
USE WideWorldImportersDW; SELECT OBJECT_NAME(referenced_object_id) AS [PK Table], name AS [Foreign Key], SCHEMA_NAME(schema_id) AS [FK Schema], OBJECT_NAME(parent_object_id) AS [FK Table] FROM sys.foreign_keys WHERE referenced_object_id = OBJECT_ID('Dimension.City');
Резултат:
+------------+---------------------------------------+-------------+------------+ | PK Table | Foreign Key | FK Schema | FK Table | |------------+---------------------------------------+-------------+------------| | City | FK_Fact_Order_City_Key_Dimension_City | Fact | Order | | City | FK_Fact_Sale_City_Key_Dimension_City | Fact | Sale | +------------+---------------------------------------+-------------+------------+
В този случай използвам WideWorldImportersDW база данни и връщам външните ключове, които препращат към Dimension.City
таблица (Dimension.City
таблицата съдържа колоната с първичен ключ, която препраща към външните ключове).
Опция 2 – sp_fkeys
Друг начин да получите външните ключове, които препращат към определена таблица, е да използвате sp_fkeys
системна съхранена процедура. Тази съхранена процедура ни предоставя избор за получаване на външни ключове въз основа (наред с други неща) на реферираната таблица или на референтната таблица.
В този случай се интересуваме да получим външните ключове, които препращат към дадена таблица, така че можем да направим това:
EXEC sp_fkeys @pktable_name = 'City', @pktable_owner = 'Dimension';
Резултат (с помощта на вертикален изход):
-[ RECORD 1 ]------------------------- PKTABLE_QUALIFIER | WideWorldImportersDW PKTABLE_OWNER | Dimension PKTABLE_NAME | City PKCOLUMN_NAME | City Key FKTABLE_QUALIFIER | WideWorldImportersDW FKTABLE_OWNER | Fact FKTABLE_NAME | Order FKCOLUMN_NAME | City Key KEY_SEQ | 1 UPDATE_RULE | 1 DELETE_RULE | 1 FK_NAME | FK_Fact_Order_City_Key_Dimension_City PK_NAME | PK_Dimension_City DEFERRABILITY | 7 -[ RECORD 2 ]------------------------- PKTABLE_QUALIFIER | WideWorldImportersDW PKTABLE_OWNER | Dimension PKTABLE_NAME | City PKCOLUMN_NAME | City Key FKTABLE_QUALIFIER | WideWorldImportersDW FKTABLE_OWNER | Fact FKTABLE_NAME | Sale FKCOLUMN_NAME | City Key KEY_SEQ | 1 UPDATE_RULE | 1 DELETE_RULE | 1 FK_NAME | FK_Fact_Sale_City_Key_Dimension_City PK_NAME | PK_Dimension_City DEFERRABILITY | 7
Това може лесно да се превключи за търсене на външни ключове въз основа на таблицата с външни ключове, като просто замените параметрите с @fktable_name
и @fktable_owner
:
EXEC sp_fkeys @fktable_name = 'Order', @fktable_owner = 'Fact';
Проверка вярно/грешно
Ако просто искате да знаете дали дадена таблица се препраща от външен ключ или не, но не искате да е изброена цялата, вижте Проверете дали таблицата се препраща от външен ключ в SQL Server с OBJECTPROPERTY().
Тази статия използва TableHasForeignRef
аргумент на OBJECTPROPERTY()
функция за връщане на 1
ако таблицата се препраща от външен ключ, и 0
ако не е.