2009-09-10 26 views
9

Tengo una consulta SQL que compara un valor en la base de datos a una constante:conflicto SQL intercalación cuando se compara con una columna en una tabla temporal

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

Y me da el error:

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

¿Cómo puedo evitar esto? (Sin realizar cambios en la base de datos)

ACTUALIZACIÓN: Me sale este error incluso si quito la última como (la comparación de cadenas) ...

Respuesta

13

Parece que su id 's son VARCHAR s con diferentes colaciones.

Prueba esto:

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

Gracias, no hubiera dado cuenta de que mis identificaciones eran personajes. – Justin

+0

Awesome me ayudó en un apuro. Sorprendentemente obtuve esto entre dos tablas temporales, pero de cualquier forma esto funcionó para resolver el problema. –

5

Especificar la colación dentro de la declaración de la tabla temporal.

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

+1 Pero OP diagnosticó erróneamente el problema. La columna del problema era id, no clave. He ajustado tu respuesta para que se refleje como tal. –

2

El problema es la tabla temporal. Utiliza la intercalación de tempdb.

Puede crear una tabla en su db real y no en una tabla temporal y luego tendrían la misma intercalación. O especifique la intercalación al crear la tabla temporal.

+2

No es cierto: dependiendo de cómo se haya creado la tabla temporal, tomaría la intercalación de la base de datos en la que se encuentra o la compilación de tempdb, no la maestra. Si la tabla temporal se crea explícitamente (CREATE TABLE #temp), toma la intercalación de tempdb. Si la tabla se deriva de otra tabla (SELECT * INTO #temp from mytable), toma la intercalación de la tabla de origen. –

+0

Buen punto ... ya que se crean al mismo tiempo I * erróneamente * usualmente miran la intercalación del maestro para encontrar la intercalación de tempdb. editado para incorporar la respuesta correcta. Ta :) –

+0

Un mal consejo para la solución mediante la creación de una tabla 'normal-temporal' en su db real. Hay dos técnicas para garantizar que la tabla temporal use una intercalación compatible: Kev Riley da una, (http://stackoverflow.com/a/1404916/224704) tiene la otra. –

0

tratar

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