Vous pouvez accomplir ceci en créant une colonne calculée et mettre l'index unique sur cette colonne.
ALTER TABLE MYTABLE
ADD COL2 AS (CASE WHEN COL1 IS NULL THEN CAST(ID AS NVARCHAR(255)) ELSE COL1 END)
CREATE UNIQUE INDEX UQ_COL2 ON MYTABLE (COL2)
Ceci suppose que l'ID est le PK de votre table et que COL1 est la colonne "unique ou nulle".
La colonne calculée (COL2) utilisera la valeur PK si votre colonne "unique" est null.
Il y a encore la possibilité de collisions entre la colonne ID et COL1 dans l'exemple suivant:
ID COL1 COL2
1 [NULL] 1
2 1 1
Pour contourner cela, je crée habituellement une autre colonne calculée qui stocke si la valeur de COL2 provient de l'ID colonne ou la colonne COL1:
ALTER TABLE MYTABLE
ADD COL3 AS (CASE WHEN COL1 IS NULL THEN 1 ELSE 0 END)
l'indice devrait être remplacé:
CREATE UNIQUE INDEX UQ_COL2 ON MYTABLE (COL2, COL3)
Maintenant, l'index est sur les deux colonnes calculées COL2 et col3 donc il n'y a pas de problème:
ID COL1 COL2 COL3
1 [NULL] 1 1
2 1 1 0
Voir aussi les réponses apportées à cette question: http://stackoverflow.com/questions/191421/how-to- create-a-unique-index-on-a-null-column –