¿Cómo deshacerse del conflicto de intercalación en una consulta de SQL Server?


Estoy trabajando en una vista, en la que estoy usando una unión interna en dos tablas que son de dos servidores diferentes. Estamos utilizando el servidor vinculado. Al ejecutar la consulta estoy recibiendo este mensaje:

No puede resolver el conflicto de intercalación entre "SQL_Latin1_General_CP1_CI_AS" y "Arabic_CI_AS" en la operación igual a.

No se mucho sobre cotejo. Buscando a través de Internet encuentro soluciones para usar COLLATE, pero el concepto de COLLATE no está claro para mí. Ser ¿cambió algo para alguna de las bases de datos? Estoy buscando una solución sin cambiar nada para las bases de datos.

Cualquier buen material de aprendizaje para estos conceptos es bienvenido.

Author: rory.ap, 2013-12-12

3 answers

Puede resolver el problema forzando que la intercalación utilizada en una consulta sea una intercalación particular, por ejemplo, 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. Usar COLLATE forzará a la consulta a ignorar la intercalación predeterminada en la base de datos y en su lugar usar la intercalación proporcionada, en este caso SQL_Latin1_General_CP1_CI_AS.

Básicamente lo que está pasando aquí es que cada base de datos tiene su propia intercalación que " proporciona clasificación propiedades de sensibilidad de reglas, mayúsculas y minúsculas 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 equals (=) sin abordar el conflicto entre las dos intercalaciones dispares.

 46
Author: rory.ap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-12 14:16:51

Resolví un problema similar envolviendo la consulta en otra consulta...

La consulta inicial estaba trabajando find dando columnas individuales de salida, con algunas de las columnas provenientes de sub consultas con función Max o Sum, y otras con sustituciones "distinct" o case y tales.

Me encontré con el error de intercalación después de intentar crear un solo campo de salida con...

select
rtrim(field1)+','+rtrim(field2)+','+...

La consulta se ejecutaría tal como la escribí, pero el error ocurriría después de guardar el sql y recargarlo.

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 null y otros son campos de fecha, y algunos son uniones a la izquierda (podrían ser NULL) in en otras palabras, tipos de campos mixtos. Creo que esta es la causa del problema causado por la intercalación del sistema operativo y la intercalación de la base de datos es ligeramente diferente, pero al convertir todo a cadenas recortadas antes de la selección final, lo ordena, todo en el SQL.

 3
Author: PStuart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-28 18:43:39

Si la base de datos es mantenida por usted, simplemente cree una nueva base de datos e importe los datos de la antigua. ¡el problema de cotejo está resuelto!!!!!

 0
Author: Ramanathan RM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-11 06:47:42