viernes, 21 de octubre de 2016

SQL Server - Cannot resolve the collation conflict between

Al intentar crear una vista, se obtiene el siguiente error:

Msg 468, Level 16, State 9, Procedure V_Monitor_Emails_Detalle, Line 3
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Modern_Spanish_CI_AS" in the UNION operation.

Contexto:
  • La vista es UNION entre una tabla y una vista
  • La tabla ha sido creada por el usuario
  • La vista es una vista sobre otra vista nativa de SQL Server
El problema es que algunas columnas tienen distintas "collation" que otras y esto es verificado por SQL Server, por cada columna al momento de hacer la UNION. En este caso la causa del problema es que una es una vista nativa y la otra es una tabla creada por el usuario.

Accediendo a las propiedades de cada columna, se puede ver el detalle:



La forma de resolverlo es agregando COLLATE DATABASE_DEFAULT en las columnas que correspondan, por ejemplo:

(...)

      ,[Enviado]
      ,[Error]
      ,[Cuenta]
FROM 
Correos C
UNION
SELECT Year(Fecha) As Anio, Month(Fecha) AS Mes, Day(Fecha) AS Dia, DATEPART(HOUR,Fecha) AS Hora,
      null AS [ID]
      ,null AS [Estado]
      ,null AS [Reintentos]
      ,null AS [Último reintento]
      ,[Fecha]
      ,'ND' AS [Para]
      ,null AS [CC]
      ,null AS [CO]
      ,Titulo COLLATE DATABASE_DEFAULT AS [Asunto]
      ,Adicional COLLATE DATABASE_DEFAULT AS [Cuerpo] 
      ,null AS [Adjuntos]
      ,null AS [Formato]