AlessandroD
2004-09-02 06:42:07 UTC
Ho un SQL Server 2000 SP3 ENG su Win 2000 Server ENG con un DB, e sia SQL
che il DB utilizzano come collate di default SQL_Latin1_General_CP1_CI_AS.
Su un portatile WinXP Home ITA ho installato MSDE 2000 RelA e ho provveduto
a restorare il DB usando un suo backup.
Ho notato che il collate per MSDE sul portatile è Latin1_General_CI_AS,
mentra il collate per il DB è stato mantenuto a
SQL_Latin1_General_CP1_CI_AS.
In una query eseguo una cosa di questo tipo:
select CAMPO_TXT
from TAB
union
select
'==='
union
select CAMPO_TXT
from TAB2
order by CAMPO_TXT
La query sul portatile così come è scritta genera l'errore sul conflitto
delle regole di confronto per l'operatore union.
Quindi la prima cosa che ho fatto per risolvere il problema è stato di
castare il collate della costante stringa a SQL_Latin1_General_CI_AS in
questo modo:
select CAMPO_TXT
from TAB
union
select
'===' collate SQL_Latin1_General_CI_AS
union
select CAMPO_TXT
from TAB2
order by CAMPO_TXT
Ed effettivamente ha funzionato.
Però non capisco il motivo del cast, la costante stringa non dovrebbe
ereditare il collate del DB, che coincide con quello dei campi testo nelle
tabelle referenziate dalla query? Sembra invece che utilizzi il collate del
server, almeno credo vista la natura dell'errore.
Purtroppo, siccome il portatile dove essere pronto per l'altra
settimana...., è stato consegnato appena ho fatto presente di avere risolto
la cosa, quindi non ho modo di fare delle prove di contorno per chiarirmi la
questione.
Cosa ne pensate?
Ciao, Alessandro
che il DB utilizzano come collate di default SQL_Latin1_General_CP1_CI_AS.
Su un portatile WinXP Home ITA ho installato MSDE 2000 RelA e ho provveduto
a restorare il DB usando un suo backup.
Ho notato che il collate per MSDE sul portatile è Latin1_General_CI_AS,
mentra il collate per il DB è stato mantenuto a
SQL_Latin1_General_CP1_CI_AS.
In una query eseguo una cosa di questo tipo:
select CAMPO_TXT
from TAB
union
select
'==='
union
select CAMPO_TXT
from TAB2
order by CAMPO_TXT
La query sul portatile così come è scritta genera l'errore sul conflitto
delle regole di confronto per l'operatore union.
Quindi la prima cosa che ho fatto per risolvere il problema è stato di
castare il collate della costante stringa a SQL_Latin1_General_CI_AS in
questo modo:
select CAMPO_TXT
from TAB
union
select
'===' collate SQL_Latin1_General_CI_AS
union
select CAMPO_TXT
from TAB2
order by CAMPO_TXT
Ed effettivamente ha funzionato.
Però non capisco il motivo del cast, la costante stringa non dovrebbe
ereditare il collate del DB, che coincide con quello dei campi testo nelle
tabelle referenziate dalla query? Sembra invece che utilizzi il collate del
server, almeno credo vista la natura dell'errore.
Purtroppo, siccome il portatile dove essere pronto per l'altra
settimana...., è stato consegnato appena ho fatto presente di avere risolto
la cosa, quindi non ho modo di fare delle prove di contorno per chiarirmi la
questione.
Cosa ne pensate?
Ciao, Alessandro