viernes, 2 de enero de 2009

Cannot resolve collation conflict for equal to operation

Estaba pasando a producción un sistema .Net con SQL Server y tube algunos problemas. Entre ellos, que en producción (servidorPro) aparentemente no tenía todos los procedimientos que debian estar. Por lo que me surgio la necesidad de hacer una comparación de lo que tenía en ambos servidores. No tenia ninguna herramienta a mano, por lo que hice una consulta a las bases involucradas cada una en un servidor distinto.

Hice una consulta a la tabla sysojects de ambos servidores que devolviera todos los procedimientos (type='P') de la base con diferencia.

En ambiente de testing estoy parado sobre la base que estoy comparando. Ejecute el siguiente script:

select a.name, b.name
from sysobjects a
left outer join servidorPro.basePro.dbo.sysobjects b
on a.name=b.name
where a.type='P'
order by a.name

lo cual me dio el siguiente error:
Cannot resolve collation conflict for equal to operation

Por lo que al averiguar que collate tenian las bases:
SELECT DATABASEPROPERTYEX('basePro','Collation')

me di cuenta que habian diferencias, una de ellas tiene: Modern_Spanish_CI_AS y la otra Latin1_General_BIN. De modo que a mi script anterior agregue la linea
COLLATE Latin1_General_BIN en la linea donde comparo los campos.

select a.name, b.name
from sysobjects a
left outer join servidorPro.basePro.dbo.sysobjects b
on a.name=b.name COLLATE Latin1_General_BIN
where a.type='P'
and b.name is null

¿Y que retorna este script?
Retorna todos los procedimientos de cada base y cuando uno de ellos no tiene coincidencia osea no se encuentra me retorna un NULL, con eso se que procedimiento me falta en que base de datos.

No hay comentarios: