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 originalSELECT DOC.DOCUMENTO, DOC.CLIENTE, DOC.NOMBRE_CLIENTE, LIN.ARTICULO,
ART.DESCRIPCION, LIN.CANTIDAD, DOC.TOTAL_PAGAR, CLI.CATEGORIA_CLIENTE,
PAG.CONDICION_PAGO, PAG.FORMA_PAGO, DOC.FCH_HORA_ANULA,
DOC.FCH_HORA_COBRO, 'DLCAE' AS ESTACION, ART.CLASIFICACION_3
FROM DLCAE.CLIENTE CLI INNER JOIN
DLCAE.DOCUMENTO_POS DOC ON CLI.CLIENTE = DOC.CLIENTE INNER JOIN
DLCAE.DOC_POS_LINEA LIN ON DOC.DOCUMENTO = LIN.DOCUMENTO INNER JOIN
DLCAE.ARTICULO ART ON LIN.ARTICULO = ART.ARTICULO INNER JOIN
DLCAE.PAGO_POS PAG ON DOC.DOCUMENTO = PAG.DOCUMENTO AND
DOC.TIPO = PAG.TIPO AND DOC.CAJA = PAG.CAJA
WHERE (DOC.FCH_HORA_COBRO > CONVERT(DATETIME, '2016-08-01 00:00:00', 102))
AND (CLI.CATEGORIA_CLIENTE IN ('CCEM' ,'CCAC', 'EMP10', 'EMP7', 'CCEM'))
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 originalUNION ALL
SELECT DOC.DOCUMENTO, DOC.CLIENTE, DOC.NOMBRE_CLIENTE, LIN.ARTICULO,
ART.DESCRIPCION, LIN.CANTIDAD, DOC.TOTAL_PAGAR, CLI.CATEGORIA_CLIENTE,
PAG.CONDICION_PAGO, PAG.FORMA_PAGO, DOC.FCH_HORA_ANULA,
DOC.FCH_HORA_COBRO, 'ACTIAPS' AS ESTACION, ART.CLASIFICACION_3
FROM CENTRAL.ACTIPETROL.CLIENTE CLI INNER JOIN
CENTRAL.ACTIPETROL.DOCUMENTO_POS DOC ON CLI.CLIENTE = DOC.CLIENTE INNER JOIN
CENTRAL.ACTIPETROL.DOC_POS_LINEA LIN ON DOC.DOCUMENTO = LIN.DOCUMENTO INNER JOIN
CENTRAL.ACTIPETROL.ARTICULO ART ON LIN.ARTICULO = ART.ARTICULO INNER JOIN
CENTRAL.ACTIPETROL.PAGO_POS PAG ON DOC.DOCUMENTO = PAG.DOCUMENTO AND
DOC.TIPO = PAG.TIPO AND DOC.CAJA = PAG.CAJA
WHERE (DOC.FCH_HORA_COBRO > CONVERT(DATETIME, '2016-08-01 00:00:00', 102))
AND (CLI.CATEGORIA_CLIENTE IN ('CCAC','EMP10','EMP7'))
AND (ART.CLASIFICACION_3 IN ('400', '420'))
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 originalSELECT DOC.DOCUMENTO, DOC.CLIENTE, DOC.NOMBRE_CLIENTE, LIN.ARTICULO,
ART.DESCRIPCION, LIN.CANTIDAD, DOC.TOTAL_PAGAR, CLI.CATEGORIA_CLIENTE,
PAG.CONDICION_PAGO, PAG.FORMA_PAGO, DOC.FCH_HORA_ANULA,
DOC.FCH_HORA_COBRO, 'DLCAE' AS ESTACION, ART.CLASIFICACION_3
FROM DLCAE.CLIENTE CLI INNER JOIN
DLCAE.DOCUMENTO_POS DOC ON CLI.CLIENTE = DOC.CLIENTE INNER JOIN
DLCAE.DOC_POS_LINEA LIN ON DOC.DOCUMENTO = LIN.DOCUMENTO INNER JOIN
DLCAE.ARTICULO ART ON LIN.ARTICULO = ART.ARTICULO INNER JOIN
DLCAE.PAGO_POS PAG ON DOC.DOCUMENTO = PAG.DOCUMENTO AND
DOC.TIPO = PAG.TIPO AND DOC.CAJA = PAG.CAJA
WHERE (DOC.FCH_HORA_COBRO > CONVERT(DATETIME, '2016-08-01 00:00:00', 102))
AND (CLI.CATEGORIA_CLIENTE IN ('CCEM' ,'CCAC', 'EMP10', 'EMP7', 'CCEM'))
AND (ART.CLASIFICACION_3 IN ('COMBUSTIBLES', 'LUBRICANTES'))
UNION ALL
SELECT
DOC.DOCUMENTO COLLATE Modern_Spanish_CI_AS AS DOCUMENTO,
DOC.CLIENTE COLLATE Modern_Spanish_CI_AS AS CLIENTE,
DOC.NOMBRE_CLIENTE COLLATE Modern_Spanish_CI_AS AS NOMBRE_CLIENTE,
LIN.ARTICULO COLLATE Modern_Spanish_CI_AS AS ARTICULO,
ART.DESCRIPCION COLLATE Modern_Spanish_CI_AS AS DESCRIPCION,
LIN.CANTIDAD,
DOC.TOTAL_PAGAR,
CLI.CATEGORIA_CLIENTE COLLATE Modern_Spanish_CI_AS AS CATEGORIA_CLIENTE,
PAG.CONDICION_PAGO,
PAG.FORMA_PAGO,
DOC.FCH_HORA_ANULA,
DOC.FCH_HORA_COBRO,
'ACTIAPS' COLLATE Modern_Spanish_CI_AS AS ESTACION,
ART.CLASIFICACION_3 COLLATE Modern_Spanish_CI_AS AS CLASIFICACION_3
FROM CENTRAL.ACTIPETROL.CLIENTE CLI
INNER JOIN CENTRAL.ACTIPETROL.DOCUMENTO_POS DOC ON CLI.CLIENTE COLLATE Modern_Spanish_CI_AS = DOC.CLIENTE
INNER JOIN CENTRAL.ACTIPETROL.DOC_POS_LINEA LIN ON DOC.DOCUMENTO COLLATE Modern_Spanish_CI_AS = LIN.DOCUMENTO
INNER JOIN CENTRAL.ACTIPETROL.ARTICULO ART ON LIN.ARTICULO COLLATE Modern_Spanish_CI_AS = ART.ARTICULO
INNER JOIN CENTRAL.ACTIPETROL.PAGO_POS PAG ON DOC.DOCUMENTO COLLATE Modern_Spanish_CI_AS = PAG.DOCUMENTO
AND DOC.TIPO COLLATE Modern_Spanish_CI_AS = PAG.TIPO
AND DOC.CAJA COLLATE Modern_Spanish_CI_AS = PAG.CAJA
WHERE (DOC.FCH_HORA_COBRO > CONVERT(DATETIME, '2016-02-01 00:00:00', 102))
AND (CLI.CATEGORIA_CLIENTE COLLATE Modern_Spanish_CI_AS IN ('CCAC','EMP10','EMP7'))
AND (ART.CLASIFICACION_3 COLLATE Modern_Spanish_CI_AS IN ('400', '420'))
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