Denne artikel tilbyder syv måder at returnere alle tabeller, der har fremmednøgler i en database i SQL Server.
Hver tabel returneres kun én gang, uanset hvor mange fremmednøgler den måtte have. Dette er anderledes end at returnere alle fremmednøgler sammen med deres tabeller. Hvis du vil gøre det, se 11 måder at returnere fremmede nøgler i SQL Server.
Alle eksempler her forespørger i den samme database og returnerer derfor det samme resultat.
Mulighed 1 – OBJECTPROPERTY() med sys.tables
Den første mulighed er at bruge OBJECTPROPERTY()
funktion, når du forespørger sys.tables
systemvisning.
Denne funktion accepterer en TableHasForeignKey
argument, som enten vil være 1
eller 0
(eller NULL
). Hvis det er 1
, betyder det, at tabellen har en fremmednøgle. En værdi på 0
betyder, at den ikke har nogen fremmednøgler. Derfor kan vi bruge dette i en WHERE
klausul for kun at returnere de tabeller, hvor TableHasForeignKey
er indstillet til 1
.
VÆLG SCHEMA_NAME(schema_id) AS [Skema], navn AS [Tabel]FRA sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasForeignKey') =1ORDER BY [Skema], [Tabel];
Resultat:
+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Kunstnere |+----------+---------+
Mulighed 2 – OBJECTPROPERTY() med INFORMATION_SCHEMA.TABLES
Dette eksempel bruger OBJECTPROPERTY()
når du forespørger på INFORMATION_SCHEMA.TABLES
systemvisning.
VÆLG TABLE_SCHEMA, TABLE_NAMEFRA INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasForeignKey') =1 ANDTABLE_TYPE='BASE_SCHEMA TABLE,>forudgående_NAVN TABLE,>Resultat:
+----------------+--------------+| TABLE_SCHEMA | TABLE_NAME ||----------------+--------------|| dbo | Albums || dbo | Kunstnere |+----------------+-------------+Mulighed 3 – OBJECTPROPERTY() med sys.objects
Her er endnu en mulighed, der bruger
OBJECTPROPERTY()
. Denne gang bruger jeg det, når jeg forespørger påsys.objects
systemvisning.VÆLG SCHEMA_NAME(schema_id) AS [Skema], navn AS [Table]FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasForeignKey ') =1 BESTIL EFTER [Skema], [Tabel]Resultat:
+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Kunstnere |+----------+---------+Mulighed 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS med DISTINCT
Her er et eksempel, der forespørger
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
systemvisning, hvor begrænsningstypen erFOREIGN KEY
. I dette tilfælde bruger jeg ogsåDISTINCT
klausul for at forhindre, at tabeller returneres mere end én gang, når de har mere end én fremmednøgle.VÆLG DISTINCT CONSTRAINT_SCHEMA, TABLE_NAME FRA INFORMATION_SCHEMA.TABLE_CONSTRAINTSHVERE CONSTRAINT_TYPE ='FREIGN KEY';Resultat:
+----------------------+--------------+| CONSTRAINT_SCHEMA | TABLE_NAME ||---------------------+-------------------|| dbo | Albums || dbo | Kunstnere |+---------------------+--------------+Her er, hvad der sker, hvis jeg fjerner
DISTINCT
klausul:VÆLG CONSTRAINT_SCHEMA, TABLE_NAME FRA INFORMATION_SCHEMA.TABLE_CONSTRAINTSHVERE CONSTRAINT_TYPE ='FREIGN KEY';Resultat:
+----------------------+--------------+| CONSTRAINT_SCHEMA | TABLE_NAME ||---------------------+-------------------|| dbo | Albums || dbo | Albums || dbo | Kunstnere |+---------------------+--------------+I dette tilfælde
Albums
tabel har to fremmednøgler, så jeg får to rækker for den ene tabel.Mulighed 5 – sys.foreign_keys med DISTINCT
Her er et andet eksempel, der bruger
DISTINCT
klausul, men denne gang forespørger jeg påsys.foreign_keys
systemvisning.VÆLG DISTINCT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Tabel]FRA sys.foreign_keys AS fkORDER BY [Skema], [Tabel];Resultat:
+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Kunstnere |+----------+---------+Og her er den uden
DISTINCT
klausul:VÆLG OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Tabel]FRA sys.foreign_keys AS fkORDER BY [Skema], [Tabel];Resultat:
+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Albums || dbo | Kunstnere |+----------+---------+Mulighed 6 – sys.foreign_keys med GROUP BY
Denne ligner det forrige eksempel, idet den forespørger på
sys.foreign_keys
systemvisning. Forskellen er, at snarere end at brugeDISTINCT
klausulen bruger denGROUP BY
klausul i stedet for.VÆLG OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Skema], OBJECT_NAME(fk.parent_object_id) AS [Tabel]FRA sys.foreign_keys AS fkGROUP BY OBJECT_SCHEMA_NAME(fk.parent_object_id), OBJECT_Object_id. Resultat:+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Kunstnere |+----------+---------+Mulighed 7 – OBJECTPROPERTYEX()
Dette eksempel kan være en fordobling af nogle tidligere eksempler, men det er stadig værd at nævne.
Ethvert af de foregående eksempler, der bruger
OBJECTPROPERTY()
funktion, kunne nemt omskrives til at brugeOBJECTPROPERTYEX()
fungere. Denne funktion er grundlæggende en udvidelse tilOBJECTPROPERTY()
, og det gør altOBJECTPROPERTY()
gør og mere.Så jeg kunne omskrive det første eksempel på denne side med følgende:
VÆLG SCHEMA_NAME(schema_id) AS [Skema], navn AS [Tabel]FRA sys.tablesWHERE OBJECTPROPERTYEX(object_id, 'TableHasForeignKey') =1ORDER BY [Skema], [Tabel];Resultat:
+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Kunstnere |+----------+---------+En forskel, du bør vide om, er, at disse to funktioner returnerer forskellige returtyper.
OBJECTPROPERTY()
returnerer en int hvorimodOBJECTPROPERTYEX()
returnerer en sql_variant type.