Vous pouvez utiliser le OBJECTPROPERTY()
fonction dans SQL Server pour vérifier si une table a ou non une ou plusieurs contraintes de clé étrangère.
Pour ce faire, passez l'ID d'objet de la table comme premier argument, et TableHasForeignKey
comme deuxième argument. La fonction renvoie un 1
ou un 0
selon qu'il a ou non une contrainte de clé étrangère.
Une valeur de retour de 1
signifie que la table fait avoir une contrainte de clé étrangère et une valeur de 0
signifie que non. Une valeur de retour de 1
s'applique quel que soit le nombre de clés étrangères de la table (tant qu'elle en a au moins une).
Si vous voulez une liste réelle des clés étrangères, consultez Répertorier toutes les clés étrangères d'une table dans SQL Server.
Exemple 1 - Utilisation de base
Voici un exemple rapide à démontrer.
USE WideWorldImportersDW; SELECT OBJECTPROPERTY(1493580359, 'TableHasForeignKey') AS [TableHasForeignKey];
Résultat :
+----------------------+ | TableHasForeignKey | |----------------------| | 1 | +----------------------+
Dans ce cas, le WideWorldImportersDW la base de données a une table avec l'ID fourni, et elle a une contrainte de clé étrangère.
Exemple 2 - Obtenir l'ID d'objet
Si vous connaissez le nom de la table, mais pas son ID, vous pouvez utiliser le OBJECT_ID()
fonction pour récupérer l'ID en fonction de son nom.
Exemple :
SELECT OBJECTPROPERTY(OBJECT_ID('Fact.Order'), 'TableHasForeignKey') AS [TableHasForeignKey];
Résultat :
+----------------------+ | TableHasForeignKey | |----------------------| | 1 | +----------------------+
C'est le même objet de l'exemple précédent.
Le voici à nouveau avec la sortie de l'ID séparément.
SELECT OBJECT_ID('Fact.Order') AS [Object ID], OBJECTPROPERTY(OBJECT_ID('Fact.Order'), 'TableHasForeignKey') AS [TableHasForeignKey];
Résultat :
+-------------+----------------------+ | Object ID | TableHasForeignKey | |-------------+----------------------| | 1493580359 | 1 | +-------------+----------------------+
Exemple 3 - Lorsque la table n'a PAS de clé étrangère
Voici ce qui se passe lorsque la table n'a pas de clé étrangère.
SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasForeignKey') AS [TableHasForeignKey];
Résultat :
+----------------------+ | TableHasForeignKey | |----------------------| | 0 | +----------------------+
Dans ce cas, l'objet est une table, c'est juste qu'il n'a pas de clé étrangère.
Exemple 4 - Lorsque l'objet n'est pas une table
Voici ce qui se passe lorsque la base de données contient un objet avec l'ID, mais que cet objet n'est pas une table.
SELECT OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'TableHasForeignKey') AS [TableHasForeignKey];
Résultat :
+----------------------+ | TableHasForeignKey | |----------------------| | NULL | +----------------------+
Exemple 5 - L'objet n'existe pas
SQL Server suppose que l'ID d'objet se trouve dans le contexte de base de données actuel. Si vous transmettez un ID d'objet d'une autre base de données, vous obtiendrez soit un résultat NULL, soit des résultats incorrects.
SELECT OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'TableHasForeignKey') AS [InvalidObject], OBJECTPROPERTY(12345678, 'TableHasForeignKey') AS [12345678];
Résultat :
+-----------------+------------+ | InvalidObject | 12345678 | |-----------------+------------| | NULL | NULL | +-----------------+------------+
Dans ce cas, la base de données ne contient aucun objet de ce nom ou ID, et j'obtiens donc un résultat NULL.
Vous obtiendrez également NULL en cas d'erreur ou si vous n'êtes pas autorisé à afficher l'objet.