Saltar al contenido

¿Cómo solucionar un conflicto de intercalación en una consulta de SQL Server?

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
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *