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.
- 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é).
- Instalar Nuevamente el Servidor de BD, esta es la que realmente escoges en casos extremos o si quieres asegurarte que funcione bien.
- 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... ;) - 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!
Muchas gracias por este aporte, aunque no veo la fecha, depronto estoy escribiendo ya después de muchos años :-P
ResponderEliminarBueno por lo regular hay errorsillos se repiten y no importa si han pasado ya varios años. Saludos!
ResponderEliminarExcelente me funciono la solución 4.
ResponderEliminarGracias...
Finisimo...muchas gracias por tu solucion...Excelente
ResponderEliminarA nu ma si funcionó :v thanks puse de los dos lados el collate, en cada evaluación de "=" de las columnas
ResponderEliminarMe resulto a la perfección, tenía otra tabla comunicada por linked server. perfecto.
ResponderEliminarMuchas gracias sqleroooooos!
ResponderEliminar