Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

7 Möglichkeiten, alle Tabellen mit Fremdschlüsseln in SQL Server zurückzugeben

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.