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.objects
systemvy.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_CONSTRAINTS
systemvy där begränsningstypen ärFOREIGN KEY
. I det här fallet använder jag ocksåDISTINCT
klausul 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
DISTINCT
klausul: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
Albums
tabellen 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
DISTINCT
klausul, men den här gången frågar jag eftersys.foreign_keys
systemvy.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
DISTINCT
klausul: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_keys
systemvy. Skillnaden är att snarare än att användaDISTINCT
satsen använder denGROUP BY
klausul 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.