Puede lograr esto creando una columna calculada y colocando el índice exclusivo en esa columna.
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)
Esto es suponiendo que el DI es la FC de su mesa y col1 es la columna "único o nula".
La columna calculada (COL2) usará el valor de PK si su columna "única" es nula.
Todavía existe la posibilidad de colisiones entre la columna ID y col1 en el siguiente ejemplo:
ID COL1 COL2
1 [NULL] 1
2 1 1
Para evitar esto Por lo general crear otra columna calculada que almacena si el valor de col2 proviene de la ID columna o la columna COL1:
ALTER TABLE MYTABLE
ADD COL3 AS (CASE WHEN COL1 IS NULL THEN 1 ELSE 0 END)
el índice se deben cambiar a:
CREATE UNIQUE INDEX UQ_COL2 ON MYTABLE (COL2, COL3)
Ahora es el índice en ambas columnas calculadas COL2 y col3 lo que no hay problema:
ID COL1 COL2 COL3
1 [NULL] 1 1
2 1 1 0
Véanse también las respuestas dadas a esta pregunta: http://stackoverflow.com/questions/191421/how-to- create-a-unique-index-on-a-null-column –