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

7 Möglichkeiten, alle Tabellen mit einem Primärschlüssel in SQL Server zurückzugeben

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 .