2009-09-10 7 views
9

J'ai une requête SQL qui compare une valeur dans la base de données à une constante:conflit SQL Collation lorsque l'on compare à une colonne dans une table temporaire

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

Et j'obtiens l'erreur:

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

Comment puis-je contourner cela? (Sans apporter de modifications à la base de données)

MISE À JOUR: Je reçois cette erreur même si je retire la dernière comme (la comparaison de chaînes) ...

Répondre

13

semble que vos id « s sont VARCHAR s avec différents classements.

Essayez ceci:

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

Merci, je ne l'avais pas remarqué que mes id étaient des personnages. – Justin

+0

Awesome m'a aidé dans une pincée. Étonnamment je l'ai eu entre deux tables temporaires, mais de toute façon cela a fonctionné pour résoudre le problème. –

5

spécifier le classement dans la déclaration de votre table temporaire.

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

+1 Mais OP a mal diagnostiqué le problème. La colonne du problème était id, pas la clé. J'ai ajusté ta réponse pour refléter en tant que telle. –

2

Le problème est la table temporaire. Il utilise la collation du tempdb.

Vous pouvez créer une table dans votre base de données réelle et non dans une table temporaire, et ils auront le même classement. Ou spécifiez le classement lors de la création de la table temporaire.

+2

Non vrai - en fonction de la façon dont la table temporaire a été créée, il faut soit le classement de la base de données dans laquelle vous vous trouvez, soit le classement de tempdb - pas de maître. Si la table temporaire est créée explicitement (CREATE TABLE #temp), elle prend le classement de tempdb. Si la table est dérivée d'une autre table (SELECT * INTO #temp de mytable), elle prend le classement de la table source. –

+0

Bon point ... comme ils sont créés en même temps, je regarde * à tort * habituellement la collation du maître pour trouver la collation de tempdb. édité pour incorporer la réponse correcte. Ta :) –

+0

Mauvais conseil pour contourner le problème en créant une table 'normal-temporaire' dans votre base de données actuelle. Il existe deux techniques pour s'assurer que la table temporaire utilise un classement compatible: Kev Riley en donne un, (http://stackoverflow.com/a/1404916/224704) a l'autre. –

0

essayer

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