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)

Related Posts

CURRENT_IDENT y RESEED en Sql Server Compact Edition

admin

April 21, 2018

SQL SERVER

No Comment

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: [sql] SELECT AUTOINC_NEXT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ‘MiTabla’ AND COLUMN_NAME = ‘MiColumna’ [/sql] Y como sustituto a RESEED tenemos […]

Read More

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

admin

March 28, 2016

PHP, SQL SERVER

No Comment

Para conectarse a Sql Server desde linux utilizamos este comando para instalar el driver: [bash] $ sudo yum install -y php-mssql [/bash] Por ejemplo, para php5.6: [bash] $ sudo yum install -y php56w-mssql [/bash] Esta instrucción instala freetds, una colección de librerias para conectarnos con Sql Server desde linux. Con esta librería no solo podemos […]

Read More

4 Comments

  • CarVAn on April 26, 2016

    Excelente aporte, muchas gracias!

  • Alex Sepulveda on August 17, 2017

    Muy buena solución, Gracias por el aporte..!!!

  • Jose Miguel on October 5, 2017

    Gracias. Me ha solucionado la papeleta

  • Leoncio on March 15, 2018

    Gracias, me ha solucionado

Leave a Reply to CarVAn Cancel reply

Your email address will not be published. Required fields are marked *