Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Colonna univoca di SQL Server 2008 con distinzione tra maiuscole e minuscole

L'unicità può essere imposta con un vincolo unico.

Se l'indice univoco fa distinzione tra maiuscole e minuscole è definito dalle confrontazioni del server (o della tabella) .

Puoi ottenere le regole di confronto correnti del tuo database con questa query:

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

e dovresti ottenere qualcosa come:

SQLCollation
————————————
SQL_Latin1_General_CP1_CI_AS

Qui, "CI_AS" alla fine delle regole di confronto significa:CI =senza distinzione tra maiuscole e minuscole, AS =sensibile all'accento.

Questo può essere cambiato in qualunque cosa tu abbia bisogno che sia. Se il tuo database e/o tabella hanno regole di confronto con distinzione tra maiuscole e minuscole, mi aspetto che anche l'unicità del tuo indice sia con distinzione tra maiuscole e minuscole, ad es. il tuo abcdef e ABCDEF dovrebbero essere entrambi accettabili come stringhe univoche.

Marco

AGGIORNAMENTO:

L'ho appena provato (SQL Server 2008 Developer Edition x64) - funziona per me (il mio database utilizza generalmente la "collation Latin1_General_CI_AS, ma posso definirne una diversa per tabella / anche per colonna VARCHAR):

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

e torno:

string
ABC
abc

e nessun errore relativo alla violazione dell'indice univoco.