Den här artikeln erbjuder sju sätt att returnera alla tabeller som har främmande nycklar i en databas i SQL Server.
Varje tabell returneras bara en gång, oavsett hur många främmande nycklar den kan ha. Detta skiljer sig från att returnera alla främmande nycklar, tillsammans med deras tabeller. Om du vill göra det, se 11 sätt att returnera främmande nycklar i SQL Server.
Alla exempel här frågar efter samma databas och returnerar därför samma resultat.
Alternativ 1 – OBJECTPROPERTY() med sys.tables
Det första alternativet är att använda OBJECTPROPERTY() funktion när du frågar sys.tables systemvy.
Den här funktionen accepterar en TableHasForeignKey argument, som kommer att vara antingen 1 eller 0 (eller NULL ). Om det är 1 , betyder detta att tabellen har en främmande nyckel. Ett värde på 0 betyder att den inte har några främmande nycklar. Därför kan vi använda detta i en WHERE sats för att endast returnera de tabeller där TableHasForeignKey är inställd på 1 .
VÄLJ SCHEMA_NAME(schema_id) AS [Schema], namn AS [Table]FRÅN sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasForeignKey') =1ORDER BY [Schema], [Table];
Resultat:
+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Artister |+----------+---------+
Alternativ 2 – OBJECTPROPERTY() med INFORMATION_SCHEMA.TABLES
Det här exemplet använder OBJECTPROPERTY() när du frågar efter INFORMATION_SCHEMA.TABLES systemvy.
VÄLJ TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasForeignKey') =1 ANDTABLE_TYPE='BASE_SCHEMA TABLE,>BASE_SCHEMA TABLE;Resultat:
+----------------+-------------+| TABLE_SCHEMA | TABLE_NAME ||----------------+-------------|| dbo | Album || dbo | Artister |+----------------+-------------+Alternativ 3 – OBJECTPROPERTY() med sys.objects
Här är ytterligare ett alternativ som använder
OBJECTPROPERTY(). Den här gången använder jag det när jag frågarsys.objectssystemvy.VÄLJ SCHEMA_NAME(schema_id) AS [Schema], namn AS [Table]FRÅN sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasForeignKey ') =1ORDER EFTER [Schema], [Tabell]Resultat:
+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Artister |+----------+---------+Alternativ 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS med DISTINCT
Här är ett exempel som frågar efter
INFORMATION_SCHEMA.TABLE_CONSTRAINTSsystemvy där begränsningstypen ärFOREIGN KEY. I det här fallet använder jag ocksåDISTINCTklausul för att förhindra att tabeller returneras mer än en gång när de har mer än en främmande nyckel.VÄLJ DISTINCT CONSTRAINT_SCHEMA, TABLE_NAME FRÅN INFORMATION_SCHEMA.TABLE_CONSTRAINTSHVERE CONSTRAINT_TYPE ='FREIGN KEY';Resultat:
+----------------------------+--------------+| CONSTRAINT_SCHEMA | TABLE_NAME ||---------------------+-------------------|| dbo | Album || dbo | Artister |+---------------------+--------------+Så här händer om jag tar bort
DISTINCTklausul:VÄLJ CONSTRAINT_SCHEMA, TABLE_NAME FRÅN INFORMATION_SCHEMA.TABLE_CONSTRAINTSHVERE CONSTRAINT_TYPE ='FREIGN KEY';Resultat:
+----------------------------+--------------+| CONSTRAINT_SCHEMA | TABLE_NAME ||---------------------+-------------------|| dbo | Album || dbo | Album || dbo | Artister |+---------------------+--------------+I det här fallet
Albumstabellen har två främmande nycklar, så jag får två rader för den ena tabellen.Alternativ 5 – sys.foreign_keys med DISTINCT
Här är ett annat exempel som använder
DISTINCTklausul, men den här gången frågar jag eftersys.foreign_keyssystemvy.VÄLJ DISTINCT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table]FRÅN sys.foreign_keys AS fkORDER BY [Schema], [Table];Resultat:
+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Artister |+----------+---------+Och här är den utan
DISTINCTklausul:VÄLJ OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table]FRÅN sys.foreign_keys AS fkORDER BY [Schema], [Table];Resultat:
+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Album || dbo | Artister |+----------+---------+Alternativ 6 – sys.foreign_keys med GROUP BY
Den här liknar det föregående exemplet genom att den frågar efter
sys.foreign_keyssystemvy. Skillnaden är att snarare än att användaDISTINCTsatsen använder denGROUP BYklausul istället.VÄLJ OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table]FRÅN sys.foreign_keys AS fkGROUP BY OBJECT_SCHEMA_NAME(fk.parent_object_id), OBJECT_parent.>(fk);Resultat:
+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Artister |+----------+---------+Alternativ 7 – OBJECTPROPERTYEX()
Det här exemplet kan vara en fördubbling av några tidigare exempel, men det är fortfarande värt att nämna.
Något av de tidigare exemplen som använder
OBJECTPROPERTY()funktion, kan enkelt skrivas om för att användaOBJECTPROPERTYEX()fungera. Denna funktion är i grunden ett tillägg tillOBJECTPROPERTY(), och den gör alltOBJECTPROPERTY()gör och mer.Så jag skulle kunna skriva om det första exemplet på den här sidan med följande:
VÄLJ SCHEMA_NAME(schema_id) SOM [Schema], namn SOM [Table]FRÅN sys.tablesWHERE OBJECTPROPERTYEX(object_id, 'TableHasForeignKey') =1ORDER BY [Schema], [Table];Resultat:
+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Artister |+----------+---------+En skillnad du bör känna till är att dessa två funktioner returnerar olika returtyper.
OBJECTPROPERTY()returnerar en int medanOBJECTPROPERTYEX()returnerar en sql_variant typ.