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 .