sql >> Database >  >> RDS >> Sqlserver

7 manieren om alle tabellen met externe sleutels in SQL Server te retourneren

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;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 de sys.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 beperking FOREIGN KEY . is . In dit geval gebruik ik ook de DISTINCT 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 de sys.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 de DISTINCT clausule, gebruikt het de GROUP 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 de OBJECTPROPERTYEX() . te gebruiken functie. Deze functie is in feite een uitbreiding op OBJECTPROPERTY() , en het doet alles OBJECTPROPERTY() 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 terwijl OBJECTPROPERTYEX() retourneert een sql_variant typ.


  1. Omzeilen van fouten die niet overeenkomen met architectuur bij gebruik van Microsoft Access

  2. Bulksgewijs gedeeltelijk geciteerd CSV-bestand in SQL Server invoegen

  3. Gebruik FILEGROUP_NAME() om de naam van een bestandsgroep in SQL Server te retourneren

  4. Impact van uitvoeringsplan op ASYNC_NETWORK_IO Wachten - Deel 1