2009-09-10 13 views
9

ho una query SQL che confronta un valore nel database per una costante:SQL regole di confronto conflitto quando si confrontano a una colonna in una tabella temporanea

SELECT * FROM my_table 
INNER JOIN #TempTable tem 
    ON my_table.id = temp.id 
    AND my_table.key = 'SOME STRING' 

E io ottenere l'errore:

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation. 

Come posso aggirare questo? (Senza apportare modifiche al database)

UPDATE: Ottengo questo errore anche se tolgo l'ultimo, come (il confronto tra stringhe) ...

risposta

13

Sembra che il tuo id 's sono VARCHAR s con regole di confronto diverse.

Prova questo:

SELECT * 
FROM my_table 
INNER JOIN 
     #TempTable tem 
ON  my_table.id = temp.id COLLATE SQL_Latin1_General_CP1_CI_AS 
     AND my_table.key = 'SOME STRING' 
+0

Grazie, ho bevuto notato che le mie id erano caratteri. – Justin

+0

Impressionante mi ha aiutato in un pizzico. Sorprendentemente l'ho ottenuto tra due tabelle temporanee, ma in entrambi i casi questo ha funzionato per risolvere il problema. –

5

Specificare il confronto all'interno della dichiarazione della tabella temporanea.

CREATE TABLE #TempTable (ID NVARCHAR(255) COLLATE database_default) 
+0

+1 Ma OP ha erroneamente diagnosticato il problema. La colonna del problema era id, non chiave. Ho adattato la tua risposta per riflettere come tale. –

2

Il problema è la tabella temporanea. Usa le regole di confronto del tempdb.

È possibile creare una tabella nel db effettivo e non in una tabella temporanea e quindi avrebbero le stesse regole di confronto. O specificare le regole di confronto al momento della creazione della tabella temporanea.

+2

Non vero - a seconda di come è stata creata la tabella temporanea, potrebbe prendere le regole di confronto del database in cui ci si trova o le regole di confronto di tempdb - non di master. Se la tabella temporanea viene creata in modo esplicito (CREATE TABLE #temp), accetta le regole di confronto da tempdb. Se la tabella è derivata da un'altra tabella (SELECT * INTO #temp da mytable), prende le regole di confronto dalla tabella di origine. –

+0

Buon punto ... poiché vengono creati nello stesso momento * erroneamente * di solito guardo le regole di confronto del master per trovare le regole di confronto di tempdb. editato per incorporare la risposta corretta. Ta :) –

+0

Cattivi consigli per risolvere il problema creando una tabella 'normale-temporanea' nel db effettivo. Esistono due tecniche per garantire che la tabella temporanea utilizzi una raccolta compatibile: Kev Riley ne fornisce una (http://stackoverflow.com/a/1404916/224704) ha l'altra. –

0

provare

SELECT * FROM my_table 
INNER JOIN #TempTable temp  
    ON my_table.id = temp.id collate database_default 
    AND my_table.key = 'SOME STRING' 
Problemi correlati