По-долу са два метода, които можете да използвате, за да върнете списък с външни ключове за дадена таблица в SQL Server.
Това е подобно на връщането на външните ключове въз основа на таблицата с референтни/първични ключове, с изключение на това, че връщам външните ключове въз основа на самата таблица с препратки/външни ключове.
Опция 1 – sys.foreign_keys
Следният код извлича всички ограничения на външния ключ в дадената таблица, заедно с посочените таблици.
ИЗПОЛЗВАЙТЕ WideWorldImportersDW;ИЗБЕРЕТЕ OBJECT_NAME(parent_object_id) КАТО [FK Таблица], име КАТО [Външен ключ], OBJECT_NAME(referenced_object_id) КАТО [PK Table]FROM sys.foreign_keysWHERE parent_object_id('FJECT.OID); предварително>Резултат:
+-----------+-------------------------------- ------------------+-----------+| FK Таблица | Външен ключ | PK таблица ||------------+-------------------------------- ------------------+-----------|| Поръчай | FK_Fact_Order_City_Key_Dimension_City | Град || Поръчай | FK_Факт_Поръчка_Клиент_Ключ_Измерение_Клиент | Клиент || Поръчай | FK_Fact_Order_Stock_Item_Key_Dimension_Stock Art | Стоков артикул || Поръчай | FK_Fact_Order_Order_Date_Key_Dimension_Date | Дата || Поръчай | FK_Fact_Order_Picked_Date_Key_Dimension_Date | Дата || Поръчай | FK_Факт_Поръчка_Продавач_Ключ_Измерение_Служител | Служител || Поръчай | FK_Факт_Поръчка_Избор_Ключ_Измерение_Служител | Служител |+------------+-------------------------------- ------------------+-----------+В този случай използвам WideWorldImportersDW база данни и връщам външните ключове за
Fact.Order
таблица.Опция 2 – sp_fkeys
Друг начин да получите външните ключове, които препращат към определена таблица, е да използвате
sp_fkeys
системна съхранена процедура. Тази съхранена процедура ни предоставя избор за получаване на външни ключове въз основа (наред с други неща) на реферираната таблица или на референтната таблица.В този случай се интересуваме да получим външните ключове въз основа на таблицата с външни ключове, така че можем да направим това:
EXEC sp_fkeys @fktable_name ='Поръчка', @fktable_owner ='Факт';Резултат (с помощта на вертикален изход):
-[ ЗАПИС 1 ]------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | ИзмерениеPKTABLE_NAME | CityPKCOLUMN_NAME | Градски ключFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | ФактFKTABLE_NAME | ПоръчкаFKCOLUMN_NAME | Градски ключKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_City_Key_Dimension_CityPK_NAME | PK_Dimension_CityDEFERRABILITY | 7-[ ЗАПИС 2 ]------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | ИзмерениеPKTABLE_NAME | КлиентPKCOLUMN_NAME | Клиентски ключFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | ФактFKTABLE_NAME | ПоръчкаFKCOLUMN_NAME | Ключ на клиентаKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Customer_Key_Dimension_CustomerPK_NAME | PK_Dimension_CustomerDEFERRABILITY | 7-[ ЗАПИС 3 ]------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | ИзмерениеPKTABLE_NAME | ДатаPKCOLUMN_NAME | ДатаFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | ФактFKTABLE_NAME | ПоръчкаFKCOLUMN_NAME | Дата на поръчката KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Order_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ ЗАПИС 4 ]------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | ИзмерениеPKTABLE_NAME | ДатаPKCOLUMN_NAME | ДатаFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | ФактFKTABLE_NAME | ПоръчкаFKCOLUMN_NAME | Ключ за дата на изборKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picked_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ ЗАПИС 5 ]------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | ИзмерениеPKTABLE_NAME | EmployeePKCOLUMN_NAME | Ключ за служителиFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | ФактFKTABLE_NAME | ПоръчкаFKCOLUMN_NAME | Продавач KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Salesperson_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeEFERRABILITY | 7-[ ЗАПИС 6 ]------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | ИзмерениеPKTABLE_NAME | EmployeePKCOLUMN_NAME | Ключ за служителиFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | ФактFKTABLE_NAME | ПоръчкаFKCOLUMN_NAME | Ключ за изборKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picker_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeEFERRABILITY | 7-[ ЗАПИС 7 ]------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | ИзмерениеPKTABLE_NAME | Стоков артикулPKCOLUMN_NAME | Ключ на стоков артикулFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | ФактFKTABLE_NAME | ПоръчкаFKCOLUMN_NAME | Стоков артикул KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Stock_Item_Key_Dimension_Stock ItemPK_NAME | PK_Dimension_Stock_ItemDEFERRABILITY | 7Това може лесно да се превключи за търсене на външни ключове въз основа на таблицата с първичен ключ, като просто замените параметрите с
@pktable_name
и@pktable_owner
:EXEC sp_fkeys @pktable_name ='Град', @pktable_owner ='Измерение';Проверка вярно/грешно
Ако просто искате да знаете дали дадена таблица има външен ключ или не, но не искате всичко да е изброено, вижте Проверете дали таблицата има външен ключ в SQL Server с OBJECTPROPERTY().
Тази статия използва
TableHasForeignKey
аргумент наOBJECTPROPERTY()
функция за връщане на1
ако таблицата има външен ключ и0
ако не е така.