Hvis du skal returnere alle fremmednøgler, der refererer til en given tabel i SQL Server, kan du prøve en af følgende metoder.
Den første metode forespørger sys.foreign_keys
systemvisning. Den anden metode udfører sp_fkeys
systemlagret procedure.
Mulighed 1 – sys.foreign_keys
Den følgende kode henter alle fremmednøgler, der refererer til en given tabel, sammen med primærnøgle- og fremmednøgletabellerne. Jeg inkluderer også skemaet for fremmednøgletabellerne.
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 dette tilfælde bruger jeg WideWorldImportersDW database, og jeg returnerer de fremmednøgler, der refererer til Dimension.City
tabel (Dimension.City
tabel indeholder den primære nøglekolonne, som fremmednøglerne refererer til).
Mulighed 2 – sp_fkeys
En anden måde at få de fremmednøgler, der refererer til en bestemt tabel, er at bruge sp_fkeys
system lagret procedure. Denne lagrede procedure giver os muligheden for at få fremmednøgler baseret på (blandt andet) den refererede tabel eller referencetabellen.
I dette tilfælde er vi interesserede i at få de fremmednøgler, der refererer til en given tabel, så vi kan gøre dette:
EXEC sp_fkeys @pktable_name = 'City', @pktable_owner = 'Dimension';
Resultat (ved hjælp af lodret output):
-[ 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
Dette kan nemt skiftes rundt for at søge efter fremmednøgler baseret på fremmednøgletabellen ved blot at erstatte parametrene med @fktable_name
og @fktable_owner
:
EXEC sp_fkeys @fktable_name = 'Order', @fktable_owner = 'Fact';
Et sandt/falskt tjek
Hvis du blot vil vide, om en tabel refereres til af en fremmednøgle, men du ikke vil have det hele opført, skal du se Tjek, om en tabel henvises til af en fremmednøgle i SQL Server med OBJECTPROPERTY().
Denne artikel bruger TableHasForeignRef
argument for OBJECTPROPERTY()
funktion for at returnere 1
hvis tabellen refereres af en fremmednøgle, og 0
hvis det ikke er.