Search Suggest

Errore Messaggio 468: Non è possibile risolvere il conflitto tra le regole di confronto "AAAA" e "BBBB" nell'operazione equal to.

Howdy people!



Il mondo è sempre più globale e per questo motivo sempre più spesso ci troviamo ad avere a che fare con installazioni di SQL Server localizzate in nazioni ben diverse dalla nostra.

 

Sono certo che questo errore vi sarà capitato almeno una volta:


Messaggio 468, livello 16, stato 9, riga 19
Non è possibile risolvere il conflitto tra le regole di confronto "AAAA" e "BBBB" nell'operazione equal to.


Ma cosa ci dice questo errore?

Dice che durante l'operazione di confronto di due colonne (equal to) si è verificato un problema.

Ma che tipo di problema?

Un problema relativo alle regole di confronto!
Le regole di confronto sono definite all'interno delle collation.

Per capire meglio facciamo un esempio

Creiamoci una tabella con la collate standard del nostro database e riempiamola con qualche dato.

P.S. Per vedere qual'è la collate del nostro sistema è sufficiente eseguire: SELECT SERVERPROPERTY('collation');

Create Table PROVA_TABELLA_COLLATE
(Id int Identity(1,1),
Descrizione Varchar(200) COLLATE Latin1_General_CI_AS NOT NULL)

Insert into PROVA_TABELLA_COLLATE (Descrizione) values ('Ciao')

 
Adesso creiamo un altra tabella impostando una collate ad esempio in uso in Groenlandia dove parlano il danese, mettiamoci poi qualche dato.

Noi che mastichiamo il Danese che viene parlato in Groenlandia scriviamo "Hej" che vuol dire "Ciao", ma avremmo potuto scriverci "Undskyld, jeg leder efter et husly, fordi det regner, kan du hjælpe mig?" cioè "Scusatemi, sto cercando un riparo perchè piove,potete aiutarmi?" !!!

Create Table PROVA_TABELLA_COLLATE_GREENLAND
(ID int Identity(1,1),
Beskrivelse Varchar(200) COLLATE Danish_Greenlandic_100_CI_AS_KS_WS NOT NULL
)

Insert into PROVA_TABELLA_COLLATE_GREENLAND (Beskrivelse) values ('Hej')

 

Cosa succede se eseguiamo questa select?


SELECT * FROM PROVA_TABELLA_COLLATE NOI
JOIN PROVA_TABELLA_COLLATE_GREENLAND LORO ON NOI.Descrizione = LORO.Beskrivelse


Esce appunto l'errore 468

Messaggio 468, livello 16, stato 9, riga 19
Non è possibile risolvere il conflitto tra le regole di confronto "Danish_Greenlandic_100_CI_AS_KS_WS" e "Latin1_General_CI_AS" nell'operazione equal to.


Fortunatamente il linguaggio T-SQL permette di forzare la COLLATE.
Quindi per risolvere il problema una strada possibile sarà quella di forzare la collate corretta.

Ma come si fa?

E' sufficiente aggiungere alla nostra Query nell'operate di confronto "COLLATE" più il nome di una delle due collate in gioco e SQL farà il cast:


SELECT * FROM PROVA_TABELLA_COLLATE NOI
JOIN PROVA_TABELLA_COLLATE_GREENLAND LORO ON NOI.Descrizione = LORO.Beskrivelse COLLATE Danish_Greenlandic_100_CI_AS_KS_WS


Ma cos'è la COLLATE?

Diciamo che una collate racchiude una serie di regole che sono tipiche di una certa localizzazione.
Gli esempi più immediati sono l'ordinamento dei caratteri oppure il fatto che l'interrogazione sia o meno Case sensitive.

Se volete saperne di più rimanete in ascolto, l'argomento è vasto ma ho già in progetto un articolo..

Luca Biondi @ SQLServerPerformance blog!







Next post: Di database corrotti ed aziende bloccate

Previous post: Andare in debug su una Stored Procedure

Post a Comment