Dieser Artikel bietet sieben Möglichkeiten, alle Tabellen mit Fremdschlüsseln in einer Datenbank in SQL Server zurückzugeben.
Jede Tabelle wird nur einmal zurückgegeben, unabhängig davon, wie viele Fremdschlüssel sie möglicherweise hat. Dies unterscheidet sich von der Rückgabe aller Fremdschlüssel zusammen mit ihren Tabellen. Wenn Sie dies tun möchten, lesen Sie 11 Möglichkeiten zur Rückgabe von Fremdschlüsseln in SQL Server.
Alle Beispiele hier fragen dieselbe Datenbank ab und geben daher dasselbe Ergebnis zurück.
Option 1 – OBJECTPROPERTY() mit sys.tables
Die erste Option ist die Verwendung von OBJECTPROPERTY()
Funktion beim Abfragen der sys.tables
Systemansicht.
Diese Funktion akzeptiert einen TableHasForeignKey
Argument, das entweder 1
sein wird oder 0
(oder NULL
). Wenn es 1
ist , bedeutet dies, dass die Tabelle einen Fremdschlüssel hat. Ein Wert von 0
bedeutet, dass es keine Fremdschlüssel hat. Daher können wir dies in einem WHERE
verwenden -Klausel, um nur die Tabellen zurückzugeben, bei denen TableHasForeignKey
auf 1
gesetzt ist .
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTY(object_id, 'TableHasForeignKey') = 1 ORDER BY [Schema], [Table];
Ergebnis:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | +----------+---------+
Option 2 – OBJECTPROPERTY() mit INFORMATION_SCHEMA.TABLES
Dieses Beispiel verwendet OBJECTPROPERTY()
beim Abfragen der INFORMATION_SCHEMA.TABLES
Systemansicht.
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasForeignKey') = 1 AND TABLE_TYPE='BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME;
Ergebnis:
+----------------+--------------+ | TABLE_SCHEMA | TABLE_NAME | |----------------+--------------| | dbo | Albums | | dbo | Artists | +----------------+--------------+
Option 3 – OBJECTPROPERTY() mit sys.objects
Hier ist noch eine weitere Option, die OBJECTPROPERTY()
verwendet . Diesmal verwende ich es beim Abfragen der sys.objects
Systemansicht.
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.objects WHERE type = 'U' AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasForeignKey') = 1 ORDER BY [Schema], [Table]
Ergebnis:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | +----------+---------+
Option 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS mit DISTINCT
Hier ist ein Beispiel, das INFORMATION_SCHEMA.TABLE_CONSTRAINTS
abfragt Systemansicht, in der der Einschränkungstyp FOREIGN KEY
ist . In diesem Fall verwende ich auch den DISTINCT
-Klausel, um zu verhindern, dass Tabellen mehr als einmal zurückgegeben werden, wenn sie mehr als einen Fremdschlüssel haben.
SELECT DISTINCT CONSTRAINT_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY';
Ergebnis:
+---------------------+--------------+ | CONSTRAINT_SCHEMA | TABLE_NAME | |---------------------+--------------| | dbo | Albums | | dbo | Artists | +---------------------+--------------+
Folgendes passiert, wenn ich den DISTINCT
entferne Klausel:
SELECT CONSTRAINT_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY';
Ergebnis:
+---------------------+--------------+ | CONSTRAINT_SCHEMA | TABLE_NAME | |---------------------+--------------| | dbo | Albums | | dbo | Albums | | dbo | Artists | +---------------------+--------------+
In diesem Fall die Albums
Tabelle hat zwei Fremdschlüssel, also bekomme ich zwei Zeilen für diese eine Tabelle.
Option 5 – sys.foreign_keys mit DISTINCT
Hier ist ein weiteres Beispiel, das den DISTINCT
verwendet -Klausel, aber diesmal frage ich die sys.foreign_keys
ab Systemansicht.
SELECT DISTINCT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table] FROM sys.foreign_keys AS fk ORDER BY [Schema], [Table];
Ergebnis:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | +----------+---------+
Und hier ist es ohne den DISTINCT
Klausel:
SELECT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table] FROM sys.foreign_keys AS fk ORDER BY [Schema], [Table];
Ergebnis:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Albums | | dbo | Artists | +----------+---------+
Option 6 – sys.foreign_keys mit GROUP BY
Dieses ähnelt dem vorherigen Beispiel darin, dass es die sys.foreign_keys
abfragt Systemansicht. Der Unterschied besteht darin, dass anstelle der Verwendung von DISTINCT
-Klausel verwendet sie die GROUP BY
Klausel statt.
SELECT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table] FROM sys.foreign_keys AS fk GROUP BY OBJECT_SCHEMA_NAME(fk.parent_object_id), OBJECT_NAME(fk.parent_object_id);
Ergebnis:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | +----------+---------+
Option 7 – OBJEKTEIGENSCHAFTEX()
Dieses Beispiel könnte einige frühere Beispiele verdoppeln, ist aber dennoch erwähnenswert.
Alle vorherigen Beispiele, die OBJECTPROPERTY()
verwenden Funktion, könnte leicht umgeschrieben werden, um OBJECTPROPERTYEX()
zu verwenden Funktion. Diese Funktion ist im Grunde eine Erweiterung von OBJECTPROPERTY()
, und es macht alles OBJECTPROPERTY()
tut und mehr.
So könnte ich das erste Beispiel auf dieser Seite folgendermaßen umschreiben:
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTYEX(object_id, 'TableHasForeignKey') = 1 ORDER BY [Schema], [Table];
Ergebnis:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | +----------+---------+
Ein Unterschied, den Sie kennen sollten, besteht darin, dass diese beiden Funktionen unterschiedliche Rückgabetypen zurückgeben. OBJECTPROPERTY()
gibt ein int zurück wohingegen OBJECTPROPERTYEX()
gibt eine sql_variant zurück Typ.