Supprimer une colonne avec une contrainte sur SQL Serveur

Nous allons voir dans ce court article comment supprimer une colonne avec une contrainte (clé étrangère par exemple) tout en n'ayant pas connaissance de la nomenclature de cette dernière (contrainte générée avec un nom par défaut)

Qui n'est jamais tombé sur cette erreur à s'arracher les cheveux pour un problème qui semble aussi simple :
erreur-sql-key

Pour réussir cette petite manœuvre, il va falloir au sein de notre requête récupérer le nom de cette contrainte, qui sera une condition sine qua non pour réussir cette suppression. Concernant notre exemple, nous allons prendre un cas concret avec une table Group et une table Users composée d'une colonne GroupId associée à la table Group.

Voici une requête qui permet de récupérer les contraintes d'une colonne (en l’occurrence, celui de la colonne GroupeId) :

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'Users' AND COLUMN_NAME = 'GroupId';

Résultat de cette requête :

result-sql-constraint

INFORMATION_SCHEMA.KEY_COLUMN_USAGE est une vue qui renvoie des informations sur chaque colonne comportant une contrainte. Il suffit donc de spécifier la table, la colonne et de récupérer le nom de la contrainte sur cette colonne.

Après avoir récupéré le nom de cette contrainte, il va devenir beaucoup plus facile de composer une requête qui va supprimer cette même contrainte, et juste après, la colonne associée.

DECLARE @cmd nvarchar(1000);
SELECT @cmd = 'ALTER TABLE Users DROP CONSTRAINT ' + CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'Users' AND COLUMN_NAME = 'GroupId';
EXEC(@cmd)
ALTER TABLE Users DROP COLUMN GroupId;