Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] Problema con el COLLATE

Estas en el tema de Problema con el COLLATE en el foro de SQL Server en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 09/08/2016, 08:45
Avatar de 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.
  #2 (permalink)  
Antiguo 09/08/2016, 09:00
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con el COLLATE

Vas bien solo que el collate seria en las 2 partes de los joins no nada mas en una

Código SQL:
Ver original
  1. INNER JOIN CENTRAL.ACTIPETROL.DOCUMENTO_POS DOC ON CLI.CLIENTE COLLATE Modern_Spanish_CI_AS = DOC.CLIENTE COLLATE Modern_Spanish_CI_AS

Aqui algunas referencias:

Ref1

Ref2

Ref3
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 09/08/2016, 10:12
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 10 años, 9 meses
Puntos: 46
Respuesta: Problema con el COLLATE

Gracias, probé lo que usted me aconsejo y el error aun persiste
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 COLLATE Modern_Spanish_CI_AS
  34.         INNER JOIN CENTRAL.ACTIPETROL.DOC_POS_LINEA LIN ON DOC.DOCUMENTO COLLATE Modern_Spanish_CI_AS = LIN.DOCUMENTO COLLATE Modern_Spanish_CI_AS
  35.         INNER JOIN CENTRAL.ACTIPETROL.ARTICULO ART ON LIN.ARTICULO COLLATE Modern_Spanish_CI_AS = ART.ARTICULO COLLATE Modern_Spanish_CI_AS
  36.         INNER JOIN CENTRAL.ACTIPETROL.PAGO_POS PAG ON
  37.         DOC.DOCUMENTO COLLATE Modern_Spanish_CI_AS = PAG.DOCUMENTO COLLATE Modern_Spanish_CI_AS
  38.         AND DOC.TIPO COLLATE Modern_Spanish_CI_AS = PAG.TIPO COLLATE Modern_Spanish_CI_AS
  39.         AND DOC.CAJA COLLATE Modern_Spanish_CI_AS = PAG.CAJA COLLATE Modern_Spanish_CI_AS
  40. WHERE   (DOC.FCH_HORA_COBRO > CONVERT(DATETIME, '2016-08-01 00:00:00', 102))
  41.     AND (CLI.CATEGORIA_CLIENTE COLLATE Modern_Spanish_CI_AS IN ('CCAC','EMP10','EMP7'))
  42.     AND (ART.CLASIFICACION_3 COLLATE Modern_Spanish_CI_AS IN ('400', '420'))
  43.     AND (DOC.DOCUMENTO COLLATE Modern_Spanish_CI_AS LIKE '%AP03%')

No se si el hecho de poner muchos COLLATES en la segunda query me dificulta en algo ??

Las referencias las leí pero creo que mas que todo indican como cambiar el collate de la DB, no se si al final esa podría ser una solución ??
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #4 (permalink)  
Antiguo 09/08/2016, 10:22
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con el COLLATE

No, las referencias te indican que revises cuales son las columnas que tiene un collate distinto para que te enfoques en ellas, te sigue apareciendo el mismo error? en las referencias se indica que "todas las operaciones con string tengan el collate" ahora vamonos por partes, en lugar de hacer todo el query empieza haciendo partes del mismo me explico? en lugar de tener

Código SQL:
Ver original
  1. SELECT * FROM tabla1
  2. JOIN tabla2...
  3. JOIN tabla3....
  4. JOIN tabla4...
Nada mas hagas

Código SQL:
Ver original
  1. SELECT * FROM server1.dbo.tabla1
  2. UNION
  3. SELECT * FROM server2.dbo.tabla1

para ir viendo donde estan los errores de collation, y lo otro como bien te indican es cambiar el collation de tu base de datos y tener el mismo en ambos servidores, ahora porque la razon de tener 2 collations? Nada mas porque a la Jefa se le ocurrio? o hay un razon valida?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 09/08/2016, 12:45
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 10 años, 9 meses
Puntos: 46
Respuesta: Problema con el COLLATE

Cita:
Iniciado por Libras Ver Mensaje

para ir viendo donde estan los errores de collation, y lo otro como bien te indican es cambiar el collation de tu base de datos y tener el mismo en ambos servidores, ahora porque la razon de tener 2 collations? Nada mas porque a la Jefa se le ocurrio? o hay un razon valida?
Duda, le puedo cambiar el COLLATE asi nada mas ?? osea clic derecho propiedades, le cambio el COLLATE y ya ??

Eso no afectaría en los datos de mi base ?? son bases de empresa enorme, mucha información delicada...
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #6 (permalink)  
Antiguo 09/08/2016, 13:17
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Problema con el COLLATE

Con el permiso de Libras

Aqui tienes una liga donde se menciona como cambiar el Collate

http://www.codeproject.com/Articles/...f-all-Database
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 09/08/2016, 14:03
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con el COLLATE

Cita:
Iniciado por iislas Ver Mensaje
Con el permiso de Libras
No tiene que pedir permiso mi esimado ;) y muy buen aporte :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 09/08/2016, 15:52
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 10 años, 9 meses
Puntos: 46
Respuesta: Problema con el COLLATE

Cita:
Iniciado por iislas Ver Mensaje
Con el permiso de Libras

Aqui tienes una liga donde se menciona como cambiar el Collate

http://www.codeproject.com/Articles/...f-all-Database
Gracias, pero creo que hice la duda muy a lo noob. A ver, la duda es, que problemas puedo tener al cambiar el COLLATE ??

Algo referente a data e integridad...
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #9 (permalink)  
Antiguo 09/08/2016, 16:38
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con el COLLATE

Vamos a ver donde esta el problema:

Creamos 1 tabla

El collate por default de mi servidor es: Modern_Spanish_CI_AS

Código SQL:
Ver original
  1. CREATE TABLE testing
  2. (
  3. valor1 VARCHAR(20),
  4. valor2 VARCHAR(20),
  5. valor3 VARCHAR(20)
  6. )
  7.  
  8. --Ejecutamos algunas veces este query:
  9. INSERT INTO testing VALUES ('AAAAA','BBBB','CCCC')

Ahora creamos 3 tablas para usar diferentes collations:

Código SQL:
Ver original
  1. SELECT VALUE = valor1, value2=valor2, value3=valor3 COLLATE Modern_Spanish_CI_AS INTO collate_1 FROM testing
  2. SELECT VALUE = valor1, value2=valor2, value3=valor3 COLLATE SQL_Latin1_General_CP1_CI_AS INTO collate_2 FROM testing
  3. SELECT VALUE = valor1, value2=valor2, value3=valor3 COLLATE SQL_Latin1_General_CP1_CI_AS INTO collate_3 FROM testing

Hacemos un query con un join:

Código SQL:
Ver original
  1. SELECT t1.VALUE  ,t1.value2  ,t1.value3 , t2.VALUE  , t2.value2  , t2.value3  
  2. FROM collate_1 AS t1
  3. INNER JOIN collate_3  AS t2 ON (t1.VALUE  = t2.VALUE  )
  4. UNION ALL
  5. SELECT t1.VALUE,t1.value2,t1.value3, t2.VALUE, t2.value2, t2.value3   FROM collate_2 AS t1
  6. INNER JOIN collate_3 AS t2 ON (t1.VALUE=t2.VALUE)

y nos manda el error:

Mens. 457, Nivel 16, Estado 1, Línea 1
No se puede realizar la conversión implícita del valor varchar a varchar porque la intercalación del valor no está resuelta a causa de un conflicto de intercalación entre "SQL_Latin1_General_CP1_CI_AS" y "Modern_Spanish_CI_AS" en el operador UNION ALL.

ahora hacemos un query usando collate:

Código SQL:
Ver original
  1. SELECT t1.VALUE  ,t1.value2  ,t1.value3 , t2.VALUE  , t2.value2  , t2.value3  COLLATE DATABASE_DEFAULT
  2. FROM collate_1 AS t1
  3. INNER JOIN collate_3  AS t2 ON (t1.VALUE  = t2.VALUE  )
  4. UNION ALL
  5. SELECT t1.VALUE,t1.value2,t1.value3, t2.VALUE, t2.value2, t2.value3   FROM collate_2 AS t1
  6. INNER JOIN collate_3 AS t2 ON (t1.VALUE=t2.VALUE)
Nos vuelve a mandar error.......Verificamos el collate de nuestras tablas:

Código SQL:
Ver original
  1. SELECT
  2.     col.name, col.collation_name
  3. FROM
  4.     sys.COLUMNS col
  5. WHERE
  6.     object_id = OBJECT_ID('collate_1')
  7.  
  8. --value Modern_Spanish_CI_AS
  9. --value2    Modern_Spanish_CI_AS
  10. --value3    Modern_Spanish_CI_AS
  11.  
  12. SELECT
  13.     col.name, col.collation_name
  14. FROM
  15.     sys.COLUMNS col
  16. WHERE
  17.     object_id = OBJECT_ID('collate_2')
  18.  
  19. --value Modern_Spanish_CI_AS
  20. --value2    Modern_Spanish_CI_AS
  21. --value3    SQL_Latin1_General_CP1_CI_AS
  22.  
  23. SELECT
  24.     col.name, col.collation_name
  25. FROM
  26.     sys.COLUMNS col
  27. WHERE
  28.     object_id = OBJECT_ID('collate_3')
  29.  
  30. --value Modern_Spanish_CI_AS
  31. --value2    Modern_Spanish_CI_AS
  32. --value3    SQL_Latin1_General_CP1_CI_AS

Y vemos que en 2 de ellas tenemos un collate diferente, para eso usamos el siguiente query:

Código SQL:
Ver original
  1. SELECT t1.VALUE  ,t1.value2  ,t1.value3 COLLATE database_default, t2.VALUE  , t2.value2  , t2.value3  COLLATE DATABASE_DEFAULT
  2. FROM collate_1 AS t1
  3. INNER JOIN collate_3  AS t2 ON (t1.VALUE  = t2.VALUE  )
  4. UNION ALL
  5. SELECT t1.VALUE,t1.value2,t1.value3, t2.VALUE, t2.value2, t2.value3   FROM collate_2 AS t1
  6. INNER JOIN collate_3 AS t2 ON (t1.VALUE=t2.VALUE)
Y nos regresa el resultado :), aqui lo que hay que tomar en cuenta son las columnas con collate diferente, revisa las de tu base de datos y ve cuales necesitas incluir en tu query :)

P.D: Tambien se puede usar en lugar del collate database_default el collate correspondiente en mi caso Modern_Spanish_CI_AS
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 09/08/2016 a las 16:44
  #10 (permalink)  
Antiguo 09/08/2016, 17:38
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 10 años, 9 meses
Puntos: 46
Respuesta: Problema con el COLLATE

Cita:
Iniciado por Libras
El problema que veo es que no estas poniendo el collate en las columnas que se requieren, revisa que columnas requieren que uses un collate diferente y sobre esas haz el cambio, no necesitas poner collate en el join con que lo pongas sobre el campo es mas que suficiente
Bien, al menos ya consulte cada tabla en su base de datos
Código SQL:
Ver original
  1. SELECT col.name, col.collation_name
  2. FROM sys.COLUMNS col
  3. WHERE object_id = OBJECT_ID('ACTIPETROL.ARTICULO')

Para cada base los COLLATE son los mismos, la del SQL_Latin1_General_CP1_CI_AS para la CENTRAL y la De Modern_Spanish_CI_AS para EXACTUS

En ninguna tabla tengo mezclados los COLLATES, eso significa que en base a esos dos debo hacer la consulta, pero si se fija en mis primeros ejemplos a todos los campos les puse el COLLATE Modern_Spanish_CI_AS en la segunda consulta, osea, los datos que traigo de la central.

Mañana hare su ultimo ejemplo, solo poniendo el COLLATE en los campos del SELECT

Pendiente...
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #11 (permalink)  
Antiguo 09/08/2016, 20:54
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con el COLLATE

No entendiste, en mi ejemplo estan mezclados los collate porque asi los hice, mi base de datos tiene un collate, y para no crear otra base de datos con un collate diferente lo que hice fue una tabla con 2 collates, lo que queria que revisaras es que columnas tienen collate para que esas columnas les hagas el cambio de collate.

Revisa que todas las columnas tengan este cambio, veo que usas diferentes tablas, asi que revisa en todas ellas ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #12 (permalink)  
Antiguo 10/08/2016, 15:53
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 10 años, 9 meses
Puntos: 46
Respuesta: Problema con el COLLATE

Avance...

Con la consulta
Código SQL:
Ver original
  1. SELECT SERVERPROPERTY('Collation')
  2.  SELECT DATABASEPROPERTYEX('EXACTUS', 'Collation')

Veo que el server y la base CENTRAL tienen SQL_Latin1_General_CP1_CI_AS pero que la base EXACTUS es la perdida que tiene Modern_Spanish_CI_AS

Asi que rearme la query para ponerle al select de EXACTUS el COLLATE
Código SQL:
Ver original
  1. SELECT    
  2.      DOC.DOCUMENTO COLLATE SQL_Latin1_General_CP1_CI_AS AS DOCUMENTO,
  3.      DOC.CLIENTE COLLATE SQL_Latin1_General_CP1_CI_AS AS CLIENTE,
  4.      DOC.NOMBRE_CLIENTE COLLATE SQL_Latin1_General_CP1_CI_AS AS NOMBRE_CLIENTE,
  5.      LIN.ARTICULO COLLATE SQL_Latin1_General_CP1_CI_AS AS ARTICULO,
  6.      ART.DESCRIPCION COLLATE SQL_Latin1_General_CP1_CI_AS AS DESCRIPCION,
  7.      LIN.CANTIDAD,
  8.      DOC.TOTAL_PAGAR,
  9.      CLI.CATEGORIA_CLIENTE COLLATE SQL_Latin1_General_CP1_CI_AS AS CATEGORIA_CLIENTE,
  10.      PAG.CONDICION_PAGO,
  11.      PAG.FORMA_PAGO,
  12.      DOC.FCH_HORA_ANULA,
  13.      DOC.FCH_HORA_COBRO,
  14.      'DLCAE'  AS ESTACION,
  15.      ART.CLASIFICACION_3 COLLATE SQL_Latin1_General_CP1_CI_AS AS CLASIFICACION_3
  16. FROM    DLCAE.CLIENTE CLI
  17.         INNER JOIN DLCAE.DOCUMENTO_POS DOC ON CLI.CLIENTE COLLATE SQL_Latin1_General_CP1_CI_AS = DOC.CLIENTE COLLATE SQL_Latin1_General_CP1_CI_AS
  18.         INNER JOIN DLCAE.DOC_POS_LINEA LIN ON DOC.DOCUMENTO COLLATE SQL_Latin1_General_CP1_CI_AS = LIN.DOCUMENTO COLLATE SQL_Latin1_General_CP1_CI_AS
  19.         INNER JOIN DLCAE.ARTICULO ART ON LIN.ARTICULO COLLATE SQL_Latin1_General_CP1_CI_AS = ART.ARTICULO COLLATE SQL_Latin1_General_CP1_CI_AS
  20.         INNER JOIN DLCAE.PAGO_POS PAG ON DOC.DOCUMENTO COLLATE SQL_Latin1_General_CP1_CI_AS = PAG.DOCUMENTO COLLATE SQL_Latin1_General_CP1_CI_AS
  21.         AND DOC.TIPO COLLATE SQL_Latin1_General_CP1_CI_AS = PAG.TIPO COLLATE SQL_Latin1_General_CP1_CI_AS
  22.         AND DOC.CAJA COLLATE SQL_Latin1_General_CP1_CI_AS = PAG.CAJA COLLATE SQL_Latin1_General_CP1_CI_AS
  23. WHERE     (DOC.FCH_HORA_COBRO > CONVERT(DATETIME, '2016-08-01 00:00:00', 102))
  24.     AND (CLI.CATEGORIA_CLIENTE COLLATE SQL_Latin1_General_CP1_CI_AS  IN ('CCEM' ,'CCAC', 'EMP10', 'EMP7', 'CCEM'))
  25.     AND (ART.CLASIFICACION_3 COLLATE SQL_Latin1_General_CP1_CI_AS  IN ('COMBUSTIBLES', 'LUBRICANTES'))
  26.  
  27. UNION ALL
  28.  
  29. SELECT    
  30.      DOC.DOCUMENTO  AS DOCUMENTO,
  31.      DOC.CLIENTE  AS CLIENTE,
  32.      DOC.NOMBRE_CLIENTE  AS NOMBRE_CLIENTE,
  33.      LIN.ARTICULO  AS ARTICULO,
  34.      ART.DESCRIPCION  AS DESCRIPCION,
  35.      LIN.CANTIDAD,
  36.      DOC.TOTAL_PAGAR,
  37.      CLI.CATEGORIA_CLIENTE  AS CATEGORIA_CLIENTE,
  38.      PAG.CONDICION_PAGO,
  39.      PAG.FORMA_PAGO,
  40.      DOC.FCH_HORA_ANULA,
  41.      DOC.FCH_HORA_COBRO,
  42.      'ACTIAPS'  AS ESTACION,
  43.      ART.CLASIFICACION_3  AS CLASIFICACION_3
  44. FROM    CENTRAL.ACTIPETROL.CLIENTE CLI
  45.         INNER JOIN CENTRAL.ACTIPETROL.DOCUMENTO_POS DOC ON CLI.CLIENTE  = DOC.CLIENTE
  46.         INNER JOIN CENTRAL.ACTIPETROL.DOC_POS_LINEA LIN ON DOC.DOCUMENTO  = LIN.DOCUMENTO
  47.         INNER JOIN CENTRAL.ACTIPETROL.ARTICULO ART ON LIN.ARTICULO  = ART.ARTICULO
  48.         INNER JOIN CENTRAL.ACTIPETROL.PAGO_POS PAG ON DOC.DOCUMENTO  = PAG.DOCUMENTO
  49.         AND DOC.TIPO  = PAG.TIPO
  50.         AND DOC.CAJA  = PAG.CAJA
  51. WHERE   (DOC.FCH_HORA_COBRO > CONVERT(DATETIME, '2016-08-01 00:00:00', 102))
  52.     AND (CLI.CATEGORIA_CLIENTE  IN ('CCAC','EMP10','EMP7'))
  53.     AND (ART.CLASIFICACION_3  IN ('400', '420'))
  54.     AND (DOC.DOCUMENTO  LIKE '%AP03%')

El error es el mismo, aun consultando los campos, las columnas, las tablas le ponga el COLLATE que le ponga el resultado es el mismo

Al cambiar el COLLATE con un alter me da error
Código SQL:
Ver original
  1. USE master;  
  2. GO  
  3. ALTER DATABASE EXACTUS  
  4. COLLATE SQL_Latin1_General_CP1_CI_AS ;  
  5. GO

Asi que no se que mas hacer, tengo algunos links de como cambiar collate pero no quiero hacerlo, mas que esa base es la mas grande.

Forma 1
Forma 2
Forma 3
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #13 (permalink)  
Antiguo 10/08/2016, 16:43
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 10 años, 9 meses
Puntos: 46
Respuesta: Problema con el COLLATE

Soy solo yo o el foro redirecciona infinitas veces a Facebook que se bloquea el navegador y hay que limpiar historial para que funcione ??

También los MP no funcionan
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #14 (permalink)  
Antiguo 11/08/2016, 11:44
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 10 años, 9 meses
Puntos: 46
Respuesta: Problema con el COLLATE

[RESUELTO]

Gracias mil a Libras por sus consejos, en efecto revisar cada tabla y cada campo era la solución, ya que unos campos que solo contienen números están declarados como varchar y ese era todo el problema

Divide y vencerás fue lo que hizo posible la solución.


Gracias a iislas tambien
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #15 (permalink)  
Antiguo 11/08/2016, 11:48
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con el COLLATE

De nada un placer :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #16 (permalink)  
Antiguo 15/08/2016, 10:37
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Problema con el COLLATE

De nada, por aqui andaremos cmpartiendo experiencias
__________________
MCTS Isaias Islas

Etiquetas: collate, sql, union
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:10.