Ver Mensaje Individual
  #1 (permalink)  
Antiguo 09/08/2016, 08:45
Avatar de KATHYU
KATHYU
 
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 10 años, 9 meses
Puntos: 46
Problema con el COLLATE

Buen día, a continuación les describo mi problema.

Tengo dos bases de Datos: EXACTUS y CENTRAL

EXACTUS tiene en COLLATE Modern_Spanish_CI_AS
CENTRAL tiene en COLLATE SQL_Latin1_General_CP1_CI_AS, fue la jefa no yo.

La cosa es que necesito sacar en una sola query los datos para los creditos de los empleados de las dos bases.

Tengo la primer consulta para la base exactus:
Código SQL:
Ver original
  1. SELECT     DOC.DOCUMENTO, DOC.CLIENTE, DOC.NOMBRE_CLIENTE, LIN.ARTICULO,
  2.                       ART.DESCRIPCION, LIN.CANTIDAD, DOC.TOTAL_PAGAR, CLI.CATEGORIA_CLIENTE,
  3.                       PAG.CONDICION_PAGO, PAG.FORMA_PAGO, DOC.FCH_HORA_ANULA,
  4.                       DOC.FCH_HORA_COBRO, 'DLCAE' AS ESTACION, ART.CLASIFICACION_3
  5. FROM         DLCAE.CLIENTE CLI INNER JOIN
  6.                       DLCAE.DOCUMENTO_POS DOC ON CLI.CLIENTE = DOC.CLIENTE INNER JOIN
  7.                       DLCAE.DOC_POS_LINEA LIN ON DOC.DOCUMENTO = LIN.DOCUMENTO INNER JOIN
  8.                       DLCAE.ARTICULO ART ON LIN.ARTICULO = ART.ARTICULO INNER JOIN
  9.                       DLCAE.PAGO_POS PAG ON DOC.DOCUMENTO = PAG.DOCUMENTO AND
  10.                       DOC.TIPO = PAG.TIPO AND DOC.CAJA = PAG.CAJA
  11. WHERE     (DOC.FCH_HORA_COBRO > CONVERT(DATETIME, '2016-08-01 00:00:00', 102))
  12.     AND (CLI.CATEGORIA_CLIENTE IN ('CCEM' ,'CCAC', 'EMP10', 'EMP7', 'CCEM'))
  13.     AND (ART.CLASIFICACION_3 IN ('COMBUSTIBLES', 'LUBRICANTES'))

El resultado, es excelente. El problema es que al hacer un UNION ALL con la query de la segunda base, la cual tambien funciona bien:
Código SQL:
Ver original
  1. UNION ALL
  2. SELECT     DOC.DOCUMENTO, DOC.CLIENTE, DOC.NOMBRE_CLIENTE, LIN.ARTICULO,
  3.                       ART.DESCRIPCION, LIN.CANTIDAD, DOC.TOTAL_PAGAR, CLI.CATEGORIA_CLIENTE,
  4.                       PAG.CONDICION_PAGO, PAG.FORMA_PAGO, DOC.FCH_HORA_ANULA,
  5.                       DOC.FCH_HORA_COBRO, 'ACTIAPS' AS ESTACION, ART.CLASIFICACION_3
  6. FROM         CENTRAL.ACTIPETROL.CLIENTE CLI INNER JOIN
  7.                       CENTRAL.ACTIPETROL.DOCUMENTO_POS DOC ON CLI.CLIENTE = DOC.CLIENTE INNER JOIN
  8.                       CENTRAL.ACTIPETROL.DOC_POS_LINEA LIN ON DOC.DOCUMENTO = LIN.DOCUMENTO INNER JOIN
  9.                       CENTRAL.ACTIPETROL.ARTICULO ART ON LIN.ARTICULO = ART.ARTICULO INNER JOIN
  10.                       CENTRAL.ACTIPETROL.PAGO_POS PAG ON DOC.DOCUMENTO = PAG.DOCUMENTO AND
  11.                       DOC.TIPO = PAG.TIPO AND DOC.CAJA = PAG.CAJA
  12. WHERE     (DOC.FCH_HORA_COBRO > CONVERT(DATETIME, '2016-08-01 00:00:00', 102))
  13.     AND (CLI.CATEGORIA_CLIENTE IN ('CCAC','EMP10','EMP7'))
  14.     AND (ART.CLASIFICACION_3 IN ('400', '420'))
  15.     AND (DOC.DOCUMENTO LIKE '%AP03%')

Me da error:
Msg 457, Level 16, State 1, Line 1
Implicit conversion of varchar value to varchar cannot be performed because the collation of the value is unresolved due to a collation conflict.


Ok bien, comenze a poner el COLLATE a la segunda query, ya que es la que consulta en otra base:
Código SQL:
Ver original
  1. SELECT     DOC.DOCUMENTO, DOC.CLIENTE, DOC.NOMBRE_CLIENTE, LIN.ARTICULO,
  2.                       ART.DESCRIPCION, LIN.CANTIDAD, DOC.TOTAL_PAGAR, CLI.CATEGORIA_CLIENTE,
  3.                       PAG.CONDICION_PAGO, PAG.FORMA_PAGO, DOC.FCH_HORA_ANULA,
  4.                       DOC.FCH_HORA_COBRO, 'DLCAE' AS ESTACION, ART.CLASIFICACION_3
  5. FROM         DLCAE.CLIENTE CLI INNER JOIN
  6.                       DLCAE.DOCUMENTO_POS DOC ON CLI.CLIENTE = DOC.CLIENTE INNER JOIN
  7.                       DLCAE.DOC_POS_LINEA LIN ON DOC.DOCUMENTO = LIN.DOCUMENTO INNER JOIN
  8.                       DLCAE.ARTICULO ART ON LIN.ARTICULO = ART.ARTICULO INNER JOIN
  9.                       DLCAE.PAGO_POS PAG ON DOC.DOCUMENTO = PAG.DOCUMENTO AND
  10.                       DOC.TIPO = PAG.TIPO AND DOC.CAJA = PAG.CAJA
  11. WHERE     (DOC.FCH_HORA_COBRO > CONVERT(DATETIME, '2016-08-01 00:00:00', 102))
  12.     AND (CLI.CATEGORIA_CLIENTE IN ('CCEM' ,'CCAC', 'EMP10', 'EMP7', 'CCEM'))
  13.     AND (ART.CLASIFICACION_3 IN ('COMBUSTIBLES', 'LUBRICANTES'))
  14.  
  15. UNION ALL
  16.  
  17. SELECT    
  18.      DOC.DOCUMENTO COLLATE Modern_Spanish_CI_AS AS DOCUMENTO,
  19.      DOC.CLIENTE COLLATE Modern_Spanish_CI_AS AS CLIENTE,
  20.      DOC.NOMBRE_CLIENTE COLLATE Modern_Spanish_CI_AS AS NOMBRE_CLIENTE,
  21.      LIN.ARTICULO COLLATE Modern_Spanish_CI_AS AS ARTICULO,
  22.      ART.DESCRIPCION COLLATE Modern_Spanish_CI_AS AS DESCRIPCION,
  23.      LIN.CANTIDAD,
  24.      DOC.TOTAL_PAGAR,
  25.      CLI.CATEGORIA_CLIENTE COLLATE Modern_Spanish_CI_AS AS CATEGORIA_CLIENTE,
  26.      PAG.CONDICION_PAGO,
  27.      PAG.FORMA_PAGO,
  28.      DOC.FCH_HORA_ANULA,
  29.      DOC.FCH_HORA_COBRO,
  30.      'ACTIAPS' COLLATE Modern_Spanish_CI_AS AS ESTACION,
  31.      ART.CLASIFICACION_3 COLLATE Modern_Spanish_CI_AS AS CLASIFICACION_3
  32. FROM    CENTRAL.ACTIPETROL.CLIENTE CLI
  33.         INNER JOIN CENTRAL.ACTIPETROL.DOCUMENTO_POS DOC ON CLI.CLIENTE COLLATE Modern_Spanish_CI_AS = DOC.CLIENTE
  34.         INNER JOIN CENTRAL.ACTIPETROL.DOC_POS_LINEA LIN ON DOC.DOCUMENTO COLLATE Modern_Spanish_CI_AS = LIN.DOCUMENTO
  35.         INNER JOIN CENTRAL.ACTIPETROL.ARTICULO ART ON LIN.ARTICULO COLLATE Modern_Spanish_CI_AS = ART.ARTICULO
  36.         INNER JOIN CENTRAL.ACTIPETROL.PAGO_POS PAG ON DOC.DOCUMENTO COLLATE Modern_Spanish_CI_AS = PAG.DOCUMENTO
  37.         AND DOC.TIPO COLLATE Modern_Spanish_CI_AS = PAG.TIPO
  38.         AND DOC.CAJA COLLATE Modern_Spanish_CI_AS = PAG.CAJA
  39. WHERE   (DOC.FCH_HORA_COBRO > CONVERT(DATETIME, '2016-02-01 00:00:00', 102))
  40.     AND (CLI.CATEGORIA_CLIENTE COLLATE Modern_Spanish_CI_AS IN ('CCAC','EMP10','EMP7'))
  41.     AND (ART.CLASIFICACION_3 COLLATE Modern_Spanish_CI_AS IN ('400', '420'))
  42.     AND (DOC.DOCUMENTO COLLATE Modern_Spanish_CI_AS LIKE '%AP03%')

Pero por mas que le ponga el COLLATE el error es el mismo

Otras cosas que he hecho:
1- Colocar el COLLATE Modern_Spanish_CI_AS tambien a la primera query.
2- Colocar el COLLATE SQL_Latin1_General_CP1_CI_AS a las dos.
3- Crear vistas de cada select y hacer el UNION ALL de las dos vistas.
4- Golpear mi PC

Nada a funcionado ustedes pueden decirme cual seria la forma correcta de usar ese UNION ALL entre las dos bases o si me es mas factible cambiar el COLLATE a una de mis bases (si es que es algo viable).

Cualquier sugerencia es bienvenida
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.