Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

7 façons de renvoyer toutes les tables avec une clé primaire dans SQL Server

Si jamais vous avez besoin de trouver toutes les tables qui ont une clé primaire dans SQL Server, cet article peut vous aider.

Cet article propose sept façons de renvoyer toutes les tables de la base de données actuelle qui ont une clé primaire.

Notez que la plupart de ces exemples renvoient uniquement les tables, et non les clés primaires elles-mêmes. Si vous voulez une liste de clés primaires, consultez 11 façons de renvoyer une clé primaire dans SQL Server.

Option 1 - OBJECTPROPERTY() avec sys.tables

La première option consiste à utiliser le OBJECTPROPERTY() fonction lors de l'interrogation de sys.tables vue système. Cette fonction accepte une TableHasPrimaryKey argument. Si cet argument vaut 1 , nous obtenons toutes les tables qui ont une clé primaire (si c'est 0 alors nous obtenons toutes les tables qui n'ont pas de clé primaire).

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema], 
  name AS [Table]
FROM sys.tables
WHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') = 1
ORDER BY [Schema], [Table];

Résultat :

+----------+---------+
| Schema   | Table   |
|----------+---------|
| dbo      | Albums  |
| dbo      | Artists |
| dbo      | Country |
| dbo      | Genres  |
+----------+---------+

Dans cet exemple, la base de données actuelle comporte quatre tables avec une clé primaire.

Les exemples restants interrogeront la même base de données, de sorte que les résultats seront les mêmes pour ces requêtes.

Option 2 – OBJECTPROPERTY() avec INFORMATION_SCHEMA.TABLES

Cet exemple utilise OBJECTPROPERTY() encore une fois, mais cette fois j'interroge le INFORMATION_SCHEMA.TABLES vue.

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;

Résultat :

+----------------+--------------+
| TABLE_SCHEMA   | TABLE_NAME   |
|----------------+--------------|
| dbo            | Albums       |
| dbo            | Artists      |
| dbo            | Country      |
| dbo            | Genres       |
+----------------+--------------+

Option 3 - OBJECTPROPERTY() avec sys.objects

Encore une fois OBJECTPROPERTY() vient à la rescousse. Cette fois, j'interroge le sys.objects vue système.

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]

Résultat :

+----------+---------+
| Schema   | Table   |
|----------+---------|
| dbo      | Albums  |
| dbo      | Artists |
| dbo      | Country |
| dbo      | Genres  |
+----------+---------+

Option 4 - INFORMATION_SCHEMA.TABLE_CONSTRAINTS

Vous pouvez interroger le INFORMATION_SCHEMA.TABLE_CONSTRAINTS view pour obtenir une liste de tables avec des clés primaires. Vous devez filtrer les résultats uniquement sur les lignes qui ont un CONSTRAINT_TYPE de PRIMARY KEY .

SELECT  
  CONSTRAINT_SCHEMA, 
  TABLE_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';

Résultat :

+---------------------+--------------+
| CONSTRAINT_SCHEMA   | TABLE_NAME   |
|---------------------+--------------|
| dbo                 | Artists      |
| dbo                 | Genres       |
| dbo                 | Albums       |
| dbo                 | Country      |
+---------------------+--------------+

Cette vue renvoie également le nom de la contrainte, vous pouvez donc également inclure cette colonne si nécessaire :

SELECT  
  CONSTRAINT_SCHEMA, 
  TABLE_NAME,
  CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';

Résultat :

+---------------------+--------------+-------------------------------+
| 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

Vous pouvez filtrer les sys.key_constraints afficher un CONSTRAINT_TYPE de PK pour obtenir une liste de tables avec des clés primaires.

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  OBJECT_NAME(parent_object_id) AS [Table]
FROM sys.key_constraints 
WHERE type = 'PK';

Résultat :

+----------+---------+
| Schema   | Table   |
|----------+---------|
| dbo      | Artists |
| dbo      | Genres  |
| dbo      | Albums  |
| dbo      | Country |
+----------+---------+

La voici à nouveau avec le nom de la clé primaire :

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  OBJECT_NAME(parent_object_id) AS [Table],
  name
FROM sys.key_constraints 
WHERE type = 'PK';

Résultat :

+----------+---------+-------------------------------+
| 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

Les sys.objects La vue système est une vue populaire pour renvoyer des informations sur les objets de portée de schéma, y ​​compris les clés primaires.

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  OBJECT_NAME(parent_object_id) AS [Table]
FROM sys.objects 
WHERE type = 'PK';

Résultat :

+----------+---------+
| Schema   | Table   |
|----------+---------|
| dbo      | Artists |
| dbo      | Genres  |
| dbo      | Albums  |
| dbo      | Country |
+----------+---------+

Comme pour les deux exemples précédents, nous pouvons inclure le name colonne de cette vue pour afficher le nom de la clé primaire :

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  OBJECT_NAME(parent_object_id) AS [Table],
  name
FROM sys.objects 
WHERE type = 'PK';

Résultat :

+----------+---------+-------------------------------+
| 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 - OBJECTPROPERTYEX()

Le OBJECTPROPERTYEX() la fonction fonctionne exactement comme OBJECTPROPERTY() fonction, sauf qu'elle prend en charge plus de propriétés. Par conséquent, tous les exemples précédents qui utilisent OBJECTPROPERTY() , pourrait facilement être réécrit pour utiliser OBJECTPROPERTYEX() .

Par exemple, je pourrais réécrire le premier exemple de cette page comme suit :

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema], 
  name AS [Table]
FROM sys.tables
WHERE OBJECTPROPERTYEX(object_id, 'TableHasPrimaryKey') = 1
ORDER BY [Schema], [Table];

Résultat :

+----------+---------+
| Schema   | Table   |
|----------+---------|
| dbo      | Albums  |
| dbo      | Artists |
| dbo      | Country |
| dbo      | Genres  |
+----------+---------+

Je dois mentionner que OBJECTPROPERTYEX() renvoie une sql_variant type de données, alors que OBJECTPROPERTY() renvoie un int .