Wenn Sie jemals alle Tabellen finden müssen, die einen Primärschlüssel in SQL Server haben, kann dieser Artikel helfen.
Dieser Artikel bietet sieben Möglichkeiten, alle Tabellen in der aktuellen Datenbank zurückzugeben, die einen Primärschlüssel haben.
Beachten Sie, dass die meisten dieser Beispiele nur die Tabellen zurückgeben – nicht die Primärschlüssel selbst. Wenn Sie eine Liste der Primärschlüssel wünschen, lesen Sie 11 Möglichkeiten zur Rückgabe eines Primärschlüssels in SQL Server.
Option 1 – OBJECTPROPERTY() mit sys.tables
Die erste Option beinhaltet die Verwendung von OBJECTPROPERTY()
Funktion beim Abfragen der sys.tables
Systemansicht. Diese Funktion akzeptiert einen TableHasPrimaryKey
Streit. Wenn dieses Argument den Wert 1
hat , erhalten wir alle Tabellen, die einen Primärschlüssel haben (wenn es 0
ist dann erhalten wir alle Tabellen, die keinen Primärschlüssel haben).
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') = 1 ORDER BY [Schema], [Table];
Ergebnis:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------+---------+
In diesem Beispiel hat die aktuelle Datenbank vier Tabellen mit einem Primärschlüssel.
Die verbleibenden Beispiele werden dieselbe Datenbank abfragen, sodass die Ergebnisse für diese Abfragen dieselben sind.
Option 2 – OBJECTPROPERTY() mit INFORMATION_SCHEMA.TABLES
Dieses Beispiel verwendet OBJECTPROPERTY()
wieder, aber diesmal frage ich die INFORMATION_SCHEMA.TABLES
ab ansehen.
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasPrimaryKey') = 1 AND TABLE_TYPE='BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME;
Ergebnis:
+----------------+--------------+ | TABLE_SCHEMA | TABLE_NAME | |----------------+--------------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------------+--------------+
Option 3 – OBJECTPROPERTY() mit sys.objects
Noch einmal OBJECTPROPERTY()
kommt zur Rettung. Dieses Mal frage ich die sys.objects
ab 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)), 'TableHasPrimaryKey') = 1 ORDER BY [Schema], [Table]
Ergebnis:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------+---------+
Option 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS
Sie können INFORMATION_SCHEMA.TABLE_CONSTRAINTS
abfragen view, um eine Liste der Tabellen mit Primärschlüsseln zu erhalten. Sie müssen die Ergebnisse nur auf die Zeilen filtern, die einen CONSTRAINT_TYPE
haben von PRIMARY KEY
.
SELECT CONSTRAINT_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';
Ergebnis:
+---------------------+--------------+ | CONSTRAINT_SCHEMA | TABLE_NAME | |---------------------+--------------| | dbo | Artists | | dbo | Genres | | dbo | Albums | | dbo | Country | +---------------------+--------------+
Diese Ansicht gibt auch den Einschränkungsnamen zurück, sodass Sie bei Bedarf auch diese Spalte einbeziehen können:
SELECT CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';
Ergebnis:
+---------------------+--------------+-------------------------------+ | CONSTRAINT_SCHEMA | TABLE_NAME | CONSTRAINT_NAME | |---------------------+--------------+-------------------------------| | dbo | Artists | PK__Artists__25706B50FCD918B1 | | dbo | Genres | PK__Genres__0385057E88BB96F8 | | dbo | Albums | PK__Albums__97B4BE379FC780BD | | dbo | Country | PK__Country__10D1609F97ADEC31 | +---------------------+--------------+-------------------------------+
Option 5 – sys.key_constraints
Sie können die sys.key_constraints
filtern einen CONSTRAINT_TYPE
anzeigen von PK
um eine Liste von Tabellen mit Primärschlüsseln zu erhalten.
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table] FROM sys.key_constraints WHERE type = 'PK';
Ergebnis:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Artists | | dbo | Genres | | dbo | Albums | | dbo | Country | +----------+---------+
Hier noch einmal mit dem Primärschlüsselnamen:
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], name FROM sys.key_constraints WHERE type = 'PK';
Ergebnis:
+----------+---------+-------------------------------+ | Schema | Table | name | |----------+---------+-------------------------------| | dbo | Artists | PK__Artists__25706B50FCD918B1 | | dbo | Genres | PK__Genres__0385057E88BB96F8 | | dbo | Albums | PK__Albums__97B4BE379FC780BD | | dbo | Country | PK__Country__10D1609F97ADEC31 | +----------+---------+-------------------------------+
Option 6 – sys.objects
Die sys.objects
Systemansicht ist eine beliebte Ansicht, um Informationen über schemabezogene Objekte, einschließlich Primärschlüssel, zurückzugeben.
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table] FROM sys.objects WHERE type = 'PK';
Ergebnis:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Artists | | dbo | Genres | | dbo | Albums | | dbo | Country | +----------+---------+
Wie bei den beiden vorherigen Beispielen können wir den name
einschließen Spalte dieser Ansicht, um den Namen des Primärschlüssels anzuzeigen:
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], name FROM sys.objects WHERE type = 'PK';
Ergebnis:
+----------+---------+-------------------------------+ | Schema | Table | name | |----------+---------+-------------------------------| | dbo | Artists | PK__Artists__25706B50FCD918B1 | | dbo | Genres | PK__Genres__0385057E88BB96F8 | | dbo | Albums | PK__Albums__97B4BE379FC780BD | | dbo | Country | PK__Country__10D1609F97ADEC31 | +----------+---------+-------------------------------+
Option 7 – OBJEKTEIGENSCHAFTEX()
Das OBJECTPROPERTYEX()
funktioniert genauso wie OBJECTPROPERTY()
Funktion, außer dass es mehr Eigenschaften unterstützt. Daher alle vorherigen Beispiele, die OBJECTPROPERTY()
verwenden , könnte leicht umgeschrieben werden, um OBJECTPROPERTYEX()
zu verwenden .
Zum Beispiel könnte ich das erste Beispiel auf dieser Seite wie folgt umschreiben:
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTYEX(object_id, 'TableHasPrimaryKey') = 1 ORDER BY [Schema], [Table];
Ergebnis:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------+---------+
Ich sollte das OBJECTPROPERTYEX()
erwähnen gibt eine sql_variant zurück Datentyp, wohingegen OBJECTPROPERTY()
gibt ein int zurück .