2009-10-03 15 views
20

C'è un modo per rendere una colonna sia UNIQUE che maiuscole/minuscole?Colonna univoca di SQL Server 2008 con distinzione maiuscole/minuscole

Voglio essere in grado di mettere

ABCDE e ABCDE

in una colonna unica.

+11

@Mitch: forse sta affrontando il caso # 10 :-) non si sa mai ... –

+0

In poche parole, voglio più opzioni. Prevedo che la tabella diventi veramente grande, quindi per avere 62 opzioni di carattere invece di 36. abc ... ABC ... 123 ... Inoltre, il campo usa solo 5 caratteri. –

+0

Questo post è fondamentalmente gratuito per un altro post http://stackoverflow.com/questions/1513911/most-efficient-way-to-unique-random-string –

risposta

29

L'univocità può essere applicata con un vincolo univoco.

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

è possibile ottenere la collazione corrente del database con questa query:

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

e si dovrebbe ottenere qualcosa di simile:

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

Qui, il "CI_AS" alla fine della collazione significa: CI = maiuscole/minuscole, AS = sensibile agli accenti.

Questo può essere cambiato in qualunque cosa tu abbia bisogno di essere. Se il database e/o la tabella presentano una regola di confronto con distinzione tra maiuscole e minuscole, mi aspetto che l'unicità dell'indice sia sensibile al maiuscolo/minuscolo, ad es. il tuo abcdef e ABCDEF dovrebbero essere entrambi accettabili come stringhe univoche.

Marc

UPDATE:

Ho appena provato questo (2008 Developer x64 Edition di SQL Server) - funziona per me (il mio database è generalmente utilizza il "Latin1_General_CI_AS collazione, ma mi può definire uno diverso per ogni tavolo/per colonna VARCHAR ancora):

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 mi rimetto:

string 
ABC 
abc 

e nessun errore sull'indice univoco che viene violato.

+1

Ho provato gli script elencati da marc e ha funzionato bene per me, su SQL Server 2008, a 32 bit. – RBarryYoung

+0

Sembra che non ci sia modo di farlo in tabella nell'interfaccia utente. Può tuttavia essere fatto durante la creazione del database per l'intero database, che sembra un po 'troppo ampio. –

0

Avevo bisogno di importare dati da un database case sensitive. Quando ho provato a mettere la chiave primaria sulla colonna che è la chiave primaria sul sorgente, non potrei farlo a causa delle chiavi duplicate. Ho modificato le regole di confronto per la colonna (varchar) in maiuscolo/minuscolo (fai clic con il pulsante destro del mouse sul tavolo, scegli Progettazione, evidenzia la colonna che desideri modificare e fai clic sull'elipside in Collation) e ora funziona correttamente. (SQL Server 2008 R2 a 64 bit).

+1

Un down-vote senza spiegazione. Classy. – bvj

+0

Benvenuti nell'universo SO. – cbmeeks

3

Nel caso in cui qualcuno debba farlo su un tavolo esistente che ha già un unique key/index definito su una colonna varchar/nvarchar, ecco lo script.

ALTER TABLE [YourTable] DROP CONSTRAINT [UIX_YourUniqueIndex] 
GO 

ALTER TABLE [YourTable] ALTER COLUMN [YourColumn] [nvarchar](50) COLLATE Latin1_General_CS_AS NOT NULL; 
GO 

ALTER TABLE [YourTable] ADD CONSTRAINT [UIX_YourUniqueIndex] UNIQUE NONCLUSTERED 
(
    [YourColumn] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 
0

Grazie a @Devraj Gadhavi per il passaggio perché questo è esattamente ciò che dovevo fare anche io. Stavo per fare quegli script ma poi (usando SSMS 2008R2), ho raggiunto lo stesso in un modo più pigro :-).Nella vista ad albero ho localizzato la mia tabella e colonna e poi ho fatto clic con il tasto destro sulla colonna in cui volevo modificare le regole di confronto e ho scelto 'Modifica'. Nella finestra visualizzata, ho modificato le regole di confronto nelle proprietà con la distinzione tra maiuscole e minuscole, quindi ovunque nello spazio aperto nella parte superiore della finestra (dove le colonne sono elencate sotto forma di tabella) Ho fatto clic con il tasto destro e ho scelto "Genera script di modifica" ... "

Problemi correlati