Resolver conflicto de intercalación en SQL Server

admin

July 1, 2011

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)

Related Posts

CURRENT_IDENT y RESEED en Sql Server Compact Edition

admin

April 21, 2018

SQL SERVER

Sql Server Compact Edition no cuenta con funciones como RESEED o CURRENT_IDENT, así que tenemos que hechar mano de consultas a la información de esquema y de alteración de tablas. Como sustituto a IDENT_CURRENT tenemos: Y como sustituto a RESEED tenemos que alterar la tabla: No es tan complejo ciertamente, y útil para lidiar con […]

Read More

Conexión a Sql Server con Php 5.6 linux CentOS 6

admin

March 28, 2016

PHP, SQL SERVER

Para conectarse a Sql Server desde linux utilizamos este comando para instalar el driver: Por ejemplo, para php5.6: Esta instrucción instala freetds, una colección de librerias para conectarnos con Sql Server desde linux. Con esta librería no solo podemos conectarnos desde Php, sino desde la linea de comandos, con el programa tsql. Después de instalar, […]

Read More