Solución:
Puede resolver el problema obligando a que la intercalación utilizada en una consulta sea una intercalación particular, p. Ej. SQL_Latin1_General_CP1_CI_AS
o DATABASE_DEFAULT
. Por ejemplo:
SELECT MyColumn
FROM FirstTable a
INNER JOIN SecondTable b
ON a.MyID COLLATE SQL_Latin1_General_CP1_CI_AS =
b.YourID COLLATE SQL_Latin1_General_CP1_CI_AS
En la consulta anterior, a.MyID y b.YourID serían columnas con un tipo de datos basado en texto. Utilizando COLLATE
obligará a la consulta a ignorar la intercalación predeterminada en la base de datos y, en su lugar, utilizará la intercalación proporcionada, en este caso SQL_Latin1_General_CP1_CI_AS
.
Básicamente, lo que está sucediendo aquí es que cada base de datos tiene su propia intercalación que “proporciona reglas de clasificación, mayúsculas y minúsculas y propiedades de sensibilidad de acento para sus datos” (de http://technet.microsoft.com/en-us/library/ms143726.aspx ) y se aplica a columnas con tipos de datos textuales, p.ej VARCHAR
, CHAR
, NVARCHAR
, etc. Cuando dos bases de datos tienen intercalaciones diferentes, no puede comparar columnas de texto con un operador como igual (=) sin abordar el conflicto entre las dos intercalaciones dispares.
Resolví un problema similar envolviendo la consulta en otra consulta …
La consulta inicial estaba funcionando y daba columnas individuales de salida, con algunas de las columnas provenientes de subconsultas con la función Max o Sum, y otras con sustituciones “distintas” o de casos y demás.
Encontré el error de clasificación después de intentar crear un solo campo de salida con …
select
rtrim(field1)+','+rtrim(field2)+','+...
La consulta se ejecutaría como la escribí, pero el error ocurriría después de guardar el sql y volver a cargarlo.
Terminé arreglándolo con algo como …
select z.field1+','+z.field2+','+... as OUTPUT_REC
from (select rtrim(field1), rtrim(field2), ... ) z
Algunos campos son “max” de una subconsulta, con una sustitución de mayúsculas y minúsculas si son nulos y otros son campos de fecha, y algunos son combinaciones a la izquierda (pueden ser NULL) … en otras palabras, tipos de campos mixtos. Creo que esta es la causa del problema debido a que la clasificación del sistema operativo y la clasificación de la base de datos son ligeramente diferentes, pero al convertir todo en cadenas recortadas antes de la selección final, lo clasifica, todo en el SQL.
Agregando a la respuesta aceptada, puede usar DATABASE_DEFAULT
como codificación.
Esto permite que la base de datos elija por usted y su código se vuelve más portátil.
SELECT MyColumn
FROM
FirstTable a
INNER JOIN SecondTable b
ON a.MyID COLLATE DATABASE_DEFAULT = b.YourID COLLATE DATABASE_DEFAULT