Modifier l'index d'une contrainte sans la supprimer

Vous souhaitez modifier le type d'index d'une contrainte (le changer de Clustered à NonClustered par exemple) sans toucher à la contrainte. En ce qui concerne la suppression de la contrainte, ce n’est généralement pas un problème sauf dans le cas où celle-ci est liée à un grand nombre d'autres tables par des clefs étrangères ce qui deviendra  bien compliqué.

Pour modifier l’index d’une contrainte ;

Recherchez le nom de l'index qui est créée par notre contrainte (il est préférable de nommer l’index vous même)

SELECT name FROM sys.indexes
WHERE is_primary_key = 1 AND object_id = OBJECT_ID('dbo.MaTable')
Les vues systèmes utilisées existent depuis SQL Server 2005 uniquement.

Changez « is_primary_key » par « is_unique_constraint » en fonction de ce que vous souhaitez modifier.
Ecrasez cet index avec la syntaxe appropriée (syntaxe valable depuis SQL Server 2000)

-- Remplacer par le nom de l'index trouvé ci-dessus
CREATE UNIQUE NONCLUSTERED INDEX PK__dbo_MaTable__6F7AF90B ON dbo.MaTable(Id)
WITH (DROP_EXISTING = ON)

La clause UNIQUE est indispensable. Vous ne devez pas perdre de vu que vous êtes entrain de  transformer l’index de celf primaire de Clustered (valeur par défaut pour une clef primaire) en NonClustered. Le DROP_EXISTING indique au moteur que ce n'est pas une création d'index en tant que tel mais que l'on souhaite remplacer cet index.
Vous aurez ainsi crée votre nouvel index.