La unicidad se puede imponer con una restricción única.
Si el índice único distingue entre mayúsculas y minúsculas o no, lo define la intercalación del servidor (o de la tabla). .
Puede obtener la intercalación actual de su base de datos con esta consulta:
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
y debería obtener algo como:
SQLCollation
————————————
SQL_Latin1_General_CP1_CI_AS
Aquí, el "CI_AS" al final de la colación significa:CI =No distingue entre mayúsculas y minúsculas, AS =Distingue acentos.
Esto se puede cambiar a lo que necesites que sea. Si su base de datos y/o tabla tiene una intercalación que distingue entre mayúsculas y minúsculas, espero que la singularidad de su índice también distinga entre mayúsculas y minúsculas, p. tu abcdef y ABCDEF deben ser aceptables como cadenas únicas.
Marc
ACTUALIZAR:
Acabo de probar esto (SQL Server 2008 Developer Edition x64):funciona para mí (mi base de datos generalmente usa la intercalación "Latin1_General_CI_AS, pero puedo definir una diferente por tabla/por columna VARCHAR incluso):
CREATE TABLE TestUnique
(string VARCHAR(50) COLLATE SQL_Latin1_General_Cp1_CS_AS)
CREATE UNIQUE INDEX UIX_Test ON dbo.TestUnique(string)
INSERT INTO dbo.TestUnique(string) VALUES ('abc')
INSERT INTO dbo.TestUnique(string) VALUES ('ABC')
SELECT * FROM dbo.TestUnique
y vuelvo:
string
ABC
abc
y ningún error sobre la violación del índice único.