Om du behöver returnera alla främmande nycklar som refererar till en given tabell i SQL Server, prova någon av följande metoder.
Den första metoden frågar efter sys.foreign_keys
systemvy. Den andra metoden exekverar sp_fkeys
systemlagrad procedur.
Alternativ 1 – sys.foreign_keys
Följande kod hämtar alla främmande nycklar som refererar till en given tabell, tillsammans med primärnyckeln och tabellerna för främmande nyckel. Jag inkluderar också schemat för de främmande nyckeltabellerna.
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');
Resultat:
+------------+---------------------------------------+-------------+------------+ | 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 | +------------+---------------------------------------+-------------+------------+
I det här fallet använder jag WideWorldImportersDW databas, och jag returnerar främmande nycklar som refererar till Dimension.City
tabellen (Dimension.City
Tabellen innehåller primärnyckelkolumnen som de främmande nycklarna refererar till).
Alternativ 2 – sp_fkeys
Ett annat sätt att få främmande nycklar som refererar till en viss tabell är att använda sp_fkeys
systemlagrad procedur. Denna lagrade procedur ger oss ett val att hämta främmande nycklar baserat på (bland annat) den refererade tabellen eller referenstabellen.
I det här fallet är vi intresserade av att få främmande nycklar som refererar till en given tabell, så vi kan göra detta:
EXEC sp_fkeys @pktable_name = 'City', @pktable_owner = 'Dimension';
Resultat (med vertikal utdata):
-[ 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
Detta kan enkelt växlas runt för att söka efter främmande nycklar baserat på tabellen med främmande nyckel genom att helt enkelt ersätta parametrarna med @fktable_name
och @fktable_owner
:
EXEC sp_fkeys @fktable_name = 'Order', @fktable_owner = 'Fact';
En sann/falsk kontroll
Om du bara vill veta om en tabell refereras av en främmande nyckel eller inte, men du inte vill att allt ska listas ut, se Kontrollera om en tabell refereras av en främmande nyckel i SQL Server med OBJECTPROPERTY().
Den artikeln använder TableHasForeignRef
argument för OBJECTPROPERTY()
funktion för att returnera 1
om tabellen refereras av en främmande nyckel, och 0
om det inte är det.