viernes, 1 de julio de 2011

Resolver conflicto de intercalación en SQL Server


En ocasiones tenemos que efectuar consultas JOIN o referenciadas entre tablas y cuando estas tienen diferentes intercalaciones (COLLATIONS), SQL Server nos arrojará un error del tipo "Cannot resolve the collation conflict between..." o "No se puede resolver el conflicto de intercalación entre...".
Pues bien, existe una manera sencilla de superar esta dificultad sin tener que utilizar comandos ALTER para cambiar la intercalación de alguna de las columnas, utilizando la sentencia COLLATE DATABASE_DEFAULT.
Ejemplo, en un escenario como el siguiente, en que se tengan dos o más tablas con diferentes intercalaciones en alguna de sus columnas:
CREATE TABLE Tabla1
(
Id int not null,
Descripcion varchar(50) COLLATE Latin1_General_CS_AS not null
)
GO

CREATE
TABLE Tabla2

(
Id int not null,
Descripcion varchar(50) COLLATE Modern_Spanish_CI_AI not null
)
GO
-- INSERTANDO VALORES DE PRUEBA
INSERT INTO Tabla1 VALUES (1,'Descripcion 1')
INSERT INTO Tabla1 VALUES (2,'Descripcion 2')
GO
INSERT INTO Tabla2 VALUES (1,'Descripcion 1')
INSERT INTO Tabla2 VALUES (2,'Descripcion 2')
GO

Ahora, si intentamos efectuar un JOIN o una consulta de comparación (ejemplo con la claúsula "IN"), SQL nos marcará un error.

SELECT T1.*
FROM Tabla1 T1
INNER JOIN Tabla2 T2
ON T1.Descripcion = T2.Descripcion
--ó
SELECT *
FROM Tabla1
WHERE Descripcion IN ( SELECT Descripcion FROM Tabla2 )

Nos muestra el error: 'Cannot resolve the collation conflict between "Modern_Spanish_CI_AI" and "Latin1_General_CS_AS" in the equal to operation.'
Ahora, utilzando de la siguiente manera la sentencia "COLLATE DATABASE_DEFAULT"

SELECT T1.*
FROM Tabla1 T1
INNER JOIN Tabla2 T2
ON T1.Descripcion COLLATE DATABASE_DEFAULT = T2.Descripcion COLLATE DATABASE_DEFAULT
-- Ó
SELECT *
FROM Tabla1
WHERE Descripcion COLLATE DATABASE_DEFAULT
IN ( SELECT Descripcion COLLATE DATABASE_DEFAULT FROM Tabla2 )

Nos arroja un resultado sin errores:
Id Descripcion
----------- --------------------------------------------------
1 Descripcion 1
2 Descripcion 2

(2 row(s) affected)

No hay comentarios:

Publicar un comentario