Als u alle externe sleutels moet retourneren die verwijzen naar een bepaalde tabel in SQL Server, probeert u een van de volgende methoden.
De eerste methode bevraagt de sys.foreign_keys
systeem bekijken. De tweede methode voert de sp_fkeys
. uit systeem opgeslagen procedure.
Optie 1 – sys.foreign_keys
De volgende code haalt alle refererende sleutels op die verwijzen naar een bepaalde tabel, samen met de primaire sleutel en de refererende-sleuteltabellen. Ik voeg ook het schema voor de refererende-sleuteltabellen toe.
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');
Resultaat:
+------------+---------------------------------------+-------------+------------+ | 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 | +------------+---------------------------------------+-------------+------------+
In dit geval gebruik ik de WideWorldImportersDW database, en ik retourneer de externe sleutels die verwijzen naar de Dimension.City
tabel (de Dimension.City
tabel bevat de primaire sleutelkolom waarnaar de refererende sleutels verwijzen).
Optie 2 – sp_fkeys
Een andere manier om de externe sleutels te krijgen die naar een bepaalde tabel verwijzen, is door de sp_fkeys
. te gebruiken systeem opgeslagen procedure. Deze opgeslagen procedure biedt ons de keuze om externe sleutels op te halen op basis van (onder andere) de tabel waarnaar wordt verwezen of de tabel waarnaar wordt verwezen.
In dit geval zijn we geïnteresseerd in het verkrijgen van de externe sleutels die verwijzen naar een bepaalde tabel, dus we kunnen dit doen:
EXEC sp_fkeys @pktable_name = 'City', @pktable_owner = 'Dimension';
Resultaat (met verticale uitvoer):
-[ 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
Dit kan eenvoudig worden omgeschakeld om naar refererende sleutels te zoeken op basis van de refererende-sleuteltabel door simpelweg de parameters te vervangen door @fktable_name
en @fktable_owner
:
EXEC sp_fkeys @fktable_name = 'Order', @fktable_owner = 'Fact';
Een waar/onwaar controle
Als u gewoon wilt weten of er naar een tabel wordt verwezen door een externe sleutel, maar u wilt niet dat alles wordt vermeld, raadpleegt u Controleren of naar een tabel wordt verwezen door een externe sleutel in SQL Server met OBJECTPROPERTY().
Dat artikel gebruikt de TableHasForeignRef
argument van de OBJECTPROPERTY()
functie om 1
te retourneren als naar de tabel wordt verwezen met een externe sleutel, en 0
als dat niet zo is.