L'unicité peut être imposée avec une contrainte unique.
Le fait que l'index unique soit ou non sensible à la casse est défini par le classement du serveur (ou de la table) .
Vous pouvez obtenir le classement actuel de votre base de données avec cette requête :
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
et vous devriez obtenir quelque chose comme :
SQLCollation
————————————
SQL_Latin1_General_CP1_CI_AS
Ici, le "CI_AS" à la fin du classement signifie :CI =Case Insensible, AS =Accent sensible.
Cela peut être changé en tout ce dont vous avez besoin. Si votre base de données et/ou table a un classement sensible à la casse, je m'attendrais à ce que l'unicité de votre index soit également sensible à la casse, par ex. votre abcdef et ABCDEF doivent être acceptables en tant que chaînes uniques.
Marc
MISE À JOUR :
Je viens d'essayer ceci (SQL Server 2008 Developer Edition x64) - fonctionne pour moi (ma base de données utilise généralement le classement "Latin1_General_CI_AS, mais je peux en définir un différent par table / par colonne VARCHAR même):
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
et je reviens :
string
ABC
abc
et aucune erreur concernant la violation de l'index unique.