Cannot resolve the collation conflict between "Modern_Spanish_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

El día de hoy estaba trabajando con unas tablas de unas bases de datos del servidor en donde trabajo... y al realizar una consulta, me arrojaba un error sobre su COLLATION (intercambio de caracteres entre columnas). Un error así...:

Cannot resolve the collation conflict between "Modern_Spanish_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.


SQL Server puede manejar 4 niveles de COLLATION:
  • Nivel de Servidor
    Personalmente considero que es la principal ya que de aqui hereda toda configuracion de Intercalacion que no se indique de manera explicita.
  • Nivel de Base de Datos
    Puede heredar del Servidor o se puede escoger una diferente.
  • Nivel de Columna
    Se define al momento de crear la tabla o columna
  • Nivel de Expresión
    Son expresiones utilizadas en Transact-SQL

Y bueno para no hacer largo el asunto tenemos varias formas para solucionar este problemilla.
  1. Puedes cambiar la configuración de COLLATE del servidor... (Util, si quieres usar la misma COLLATE, de forma heredada) , Recontruir la Master, pero esto no es tan sencillo como los anteriores, para SQL Server2000 se puede utilizar la herramienta REBUILDM, para SQL Server2005 hay que hacerlo desde el setup de instalacion, indicando en el wizard de modificacion (asi dice en la MSDN Library, pero personalmente fue el unico que no encontré).
  2. Instalar Nuevamente el Servidor de BD, esta es la que realmente escoges en casos extremos o si quieres asegurarte que funcione bien.
  3. Otra forma es que al momento de comparar las cadenas, en este caso... simplemente le indiques que collation necesitas que adopte, es algo así: select campos from latabla where campo collation colación_deseada, ahora un ejemplo...:
    select *from archivos ar,catalogs cat where ar.contenidos collate Modern_Spanish_CI_AS = cat.notes. También lo podíamos hacer de esta manera... : select *from archivos ar,catalogs cat where cast(ar.contenidos as varchar) collate Modern_Spanish_CI_AS = cat.notes . Y ya puedes comparar las cadenas, lo mejor de la primera forma que les mostre es que, en caso de tener indices, no te los destruye... ;)
  4. También existe la manera de modificar la configuración de COLLATE de una COLUMNA, esto se hace a través de un instrucción ALTER. La instrucción sería la siguiente:

    ALTER TABLE [nombre_tabla] ALTER COLUMN [nombre_columna]
    varchar(300) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL


    Debemos de indicar el nombre de la tabla, a su vez el nombre de la columna a afectar (preservando el tipo de dato) y finalmente indicando su COLLATE.

    ¡Saludos y Agradecimientos a Michelle, colaboradora para este post!

7 comentarios:

  1. Muchas gracias por este aporte, aunque no veo la fecha, depronto estoy escribiendo ya después de muchos años :-P

    ResponderEliminar
  2. Bueno por lo regular hay errorsillos se repiten y no importa si han pasado ya varios años. Saludos!

    ResponderEliminar
  3. Excelente me funciono la solución 4.
    Gracias...

    ResponderEliminar
  4. Finisimo...muchas gracias por tu solucion...Excelente

    ResponderEliminar
  5. A nu ma si funcionó :v thanks puse de los dos lados el collate, en cada evaluación de "=" de las columnas

    ResponderEliminar
  6. Me resulto a la perfección, tenía otra tabla comunicada por linked server. perfecto.

    ResponderEliminar