Unten sind zwei Methoden, die Sie verwenden können, um eine Liste von Fremdschlüsseln für eine bestimmte Tabelle in SQL Server zurückzugeben.
Dies ähnelt der Rückgabe der Fremdschlüssel basierend auf der referenzierten/Primärschlüsseltabelle, außer dass ich hier die Fremdschlüssel basierend auf der referenzierenden/Fremdschlüsseltabelle selbst zurückgebe.
Option 1 – sys.foreign_keys
Der folgende Code ruft alle Fremdschlüsseleinschränkungen für die angegebene Tabelle zusammen mit den referenzierten Tabellen ab.
USE WideWorldImportersDW;SELECT OBJECT_NAME(parent_object_id) AS [FK Table], name AS [Foreign Key], OBJECT_NAME(referenced_object_id) AS [PK Table]FROM sys.foreign_keysWHERE parent_object_id =OBJECT_ID('Fact.Order');Ergebnis:
+----+--------------------------------- -------------+------------+| FK-Tabelle | Fremdschlüssel | PK-Tabelle ||------------+--------------------------------- -------------+------------|| Bestellen | FK_Fact_Order_City_Key_Dimension_City | Stadt || Bestellen | FK_Fakt_Auftrag_Kunde_Schlüssel_Dimension_Kunde | Kunde || Bestellen | FK_Fact_Order_Stock_Item_Key_Dimension_Lagerartikel | Lagerartikel || Bestellen | FK_Fact_Order_Order_Date_Key_Dimension_Date | Datum || Bestellen | FK_Fact_Order_Picked_Date_Key_Dimension_Date | Datum || Bestellen | FK_Fakt_Auftrag_Verkäufer_Schlüssel_Dimension_Mitarbeiter | Mitarbeiter || Bestellen | FK_Fact_Order_Picker_Key_Dimension_Employee | Mitarbeiter |+------------+---------------------------------- -------------+------------+In diesem Fall verwende ich die WideWorldImportersDW Datenbank, und ich gebe die Fremdschlüssel für
Fact.Order
zurück Tabelle.Option 2 – sp_fkeys
Eine andere Möglichkeit, die Fremdschlüssel zu erhalten, die auf eine bestimmte Tabelle verweisen, ist die Verwendung von
sp_fkeys
System gespeicherte Prozedur. Diese gespeicherte Prozedur bietet uns die Wahl, Fremdschlüssel (unter anderem) basierend auf der referenzierten Tabelle oder der referenzierenden Tabelle zu erhalten.In diesem Fall sind wir daran interessiert, die Fremdschlüssel basierend auf der Fremdschlüsseltabelle zu erhalten, also können wir Folgendes tun:
EXEC sp_fkeys @fktable_name ='Bestellung', @fktable_owner ='Fakt';Ergebnis (bei vertikaler Ausgabe):
-[ RECORD 1 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | StadtPKCOLUMN_NAME | StadtschlüsselFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | StadtschlüsselKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_City_Key_Dimension_CityPK_NAME | PK_Dimension_CityDEFERRABILITY | 7-[ RECORD 2 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | KundePKCOLUMN_NAME | KundenschlüsselFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | KundenschlüsselKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Customer_Key_Dimension_CustomerPK_NAME | PK_Dimension_CustomerDEFERRABILITY | 7-[ RECORD 3 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | DatumPKCOLUMN_NAME | DatumFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | Bestelldatum KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Order_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ RECORD 4 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | DatumPKCOLUMN_NAME | DatumFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | Entnahmedatum KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picked_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ RECORD 5 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | MitarbeiterPKCOLUMN_NAME | MitarbeiterschlüsselFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | Verkäufer KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Salesperson_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeDEFERRABILITY | 7-[ RECORD 6 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | MitarbeiterPKCOLUMN_NAME | MitarbeiterschlüsselFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | Picker KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picker_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeDEFERRABILITY | 7-[ RECORD 7 ]-------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | LagerartikelPKCOLUMN_NAME | Lagerartikel KeyFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | TatsacheFKTABLE_NAME | Bestellen Sie FKCOLUMN_NAME | Lagerartikel KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Stock_Item_Key_Dimension_Stock ItemPK_NAME | PK_Dimension_Stock_ItemDEFERRABILITY | 7Dies kann leicht umgeschaltet werden, um nach Fremdschlüsseln basierend auf der Primärschlüsseltabelle zu suchen, indem Sie einfach die Parameter durch
@pktable_name
ersetzen und@pktable_owner
:EXEC sp_fkeys @pktable_name ='Stadt', @pktable_owner ='Dimension';Ein Wahr/Falsch-Check
Wenn Sie einfach nur wissen möchten, ob eine Tabelle einen Fremdschlüssel hat oder nicht, aber nicht alles aufgelistet haben möchten, lesen Sie den Abschnitt Überprüfen, ob eine Tabelle einen Fremdschlüssel in SQL Server mit OBJECTPROPERTY() hat.
Dieser Artikel verwendet den
TableHasForeignKey
Argument vonOBJECTPROPERTY()
Funktion, um1
zurückzugeben wenn die Tabelle einen Fremdschlüssel hat, und0
wenn nicht.