Dit artikel biedt zeven manieren om alle tabellen met externe sleutels in een database in SQL Server te retourneren.
Elke tabel wordt slechts één keer geretourneerd, ongeacht het aantal externe sleutels. Dit is anders dan het retourneren van alle externe sleutels, samen met hun tabellen. Als u dat wilt doen, raadpleegt u 11 manieren om externe sleutels in SQL Server te retourneren.
Alle voorbeelden hier vragen dezelfde database en retourneren daarom hetzelfde resultaat.
Optie 1 – OBJECTPROPERTY() met sys.tables
De eerste optie is om de OBJECTPROPERTY()
. te gebruiken functie bij het opvragen van de sys.tables
systeemweergave.
Deze functie accepteert een TableHasForeignKey
argument, dat ofwel 1
. zal zijn of 0
(of NULL
). Als het 1
is , dit betekent dat de tabel wel een externe sleutel heeft. Een waarde van 0
betekent dat het geen externe sleutels heeft. Daarom kunnen we dit gebruiken in een WHERE
clausule om alleen die tabellen terug te geven waar TableHasForeignKey
is ingesteld op 1
.
SELECT SCHEMA_NAME(schema_id) AS [Schema], naam AS [Tabel]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasForeignKey') =1ORDER BY [Schema], [Tabel];
Resultaat:
+----------+---------+| Schema | Tabel ||----------+---------|| dbo | Albums || dbo | Artiesten |+----------+---------+
Optie 2 – OBJECTPROPERTY() met INFORMATION_SCHEMA.TABLES
Dit voorbeeld gebruikt OBJECTPROPERTY()
bij het opvragen van de INFORMATION_SCHEMA.TABLES
systeemweergave.
SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasForeignKey') =1 ANDTABLE_TYPE='BASISTABEL'ORDER BY TABLE_SCHEMA;,pre>TABLE_NAME_SCHEMA;Resultaat:
+----------------+--------------+| TABLE_SCHEMA | TABLE_NAME ||----------------+--------------|| dbo | Albums || dbo | Artiesten |+----------------+--------------+Optie 3 – OBJECTPROPERTY() met sys.objects
Hier is nog een andere optie die gebruikmaakt van
OBJECTPROPERTY()
. Deze keer gebruik ik het bij het opvragen van desys.objects
systeemweergave.SELECT SCHEMA_NAME(schema_id) AS [Schema], naam AS [Table]FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasForeignKey ') =1ORDER BY [Schema], [Tabel]Resultaat:
+----------+---------+| Schema | Tabel ||----------+---------|| dbo | Albums || dbo | Artiesten |+----------+---------+Optie 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS met DISTINCT
Hier is een voorbeeld dat de
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
doorzoekt systeemweergave waarbij het type beperkingFOREIGN KEY
. is . In dit geval gebruik ik ook deDISTINCT
om te voorkomen dat tabellen meer dan één keer worden geretourneerd wanneer ze meer dan één externe sleutel hebben.SELECTEER DISTINCT CONSTRAINT_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='BUITENLANDSE SLEUTEL';Resultaat:
+---------------------+--------------+| CONSTRRAINT_SCHEMA | TABLE_NAME ||---------------------+--------------|| dbo | Albums || dbo | Artiesten |+---------------------+--------------+Dit gebeurt er als ik de
DISTINCT
. verwijder clausule:SELECT CONSTRAINT_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='BUITENLANDSE SLEUTEL';Resultaat:
+---------------------+--------------+| CONSTRRAINT_SCHEMA | TABLE_NAME ||---------------------+--------------|| dbo | Albums || dbo | Albums || dbo | Artiesten |+---------------------+--------------+In dit geval de
Albums
tabel heeft twee externe sleutels, en dus krijg ik twee rijen voor die ene tabel.Optie 5 – sys.foreign_keys met DISTINCT
Hier is nog een voorbeeld dat de
DISTINCT
. gebruikt clausule, maar deze keer vraag ik desys.foreign_keys
systeemweergave.SELECT DISTINCT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table]FROM sys.foreign_keys AS fkORDER BY [Schema], [Table];Resultaat:
+----------+---------+| Schema | Tabel ||----------+---------|| dbo | Albums || dbo | Artiesten |+----------+---------+En hier is het zonder de
DISTINCT
clausule:SELECT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table]FROM sys.foreign_keys AS fkORDER BY [Schema], [Table];Resultaat:
+----------+---------+| Schema | Tabel ||----------+---------|| dbo | Albums || dbo | Albums || dbo | Artiesten |+----------+---------+Optie 6 – sys.foreign_keys met GROUP BY
Deze is vergelijkbaar met het vorige voorbeeld omdat het de
sys.foreign_keys
opvraagt systeem bekijken. Het verschil is dat, in plaats van deDISTINCT
clausule, gebruikt het deGROUP BY
clausule in plaats daarvan.SELECT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table]FROM sys.foreign_keys AS fkGROUP BY OBJECT_SCHEMA_NAME(fk.parent_object_id), OBJECT_OBJECT(fk.parent_object_id);Resultaat:
+----------+---------+| Schema | Tabel ||----------+---------|| dbo | Albums || dbo | Artiesten |+----------+---------+Optie 7 – OBJECTPROPERTYEX()
Dit voorbeeld is misschien een verdubbeling van enkele eerdere voorbeelden, maar het is nog steeds het vermelden waard.
Elk van de voorgaande voorbeelden die de
OBJECTPROPERTY()
. gebruiken functie, kan gemakkelijk worden herschreven om deOBJECTPROPERTYEX()
. te gebruiken functie. Deze functie is in feite een uitbreiding opOBJECTPROPERTY()
, en het doet allesOBJECTPROPERTY()
doet en meer.Dus ik zou het eerste voorbeeld op deze pagina kunnen herschrijven met het volgende:
SELECT SCHEMA_NAME(schema_id) AS [Schema], naam AS [Tabel]FROM sys.tablesWHERE OBJECTPROPERTYEX(object_id, 'TableHasForeignKey') =1ORDER BY [Schema], [Tabel];Resultaat:
+----------+---------+| Schema | Tabel ||----------+---------|| dbo | Albums || dbo | Artiesten |+----------+---------+Een verschil dat u moet weten, is dat deze twee functies verschillende retourtypen retourneren.
OBJECTPROPERTY()
retourneert een int terwijlOBJECTPROPERTYEX()
retourneert een sql_variant typ.