Ver Mensaje Individual
  #14 (permalink)  
Antiguo 28/06/2016, 16:20
Azor
 
Fecha de Ingreso: febrero-2014
Ubicación: España
Mensajes: 60
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Openquery y merge

No sé si es la solución o sólo una chapuzilla pero dejando la sql de la siguiente forma funciona:

Código SQL:
Ver original
  1. WITH DESTINO AS (
  2.    SELECT empresa, alm, txt, orden, admitepedidos, email
  3.    FROM OPENQUERY(SERVIDOR_MYSQL, 'SELECT empresa, alm, txt, orden, admitepedidos, email FROM SERVIDOR_MYSQL.almacen')
  4. )
  5. UPDATE DESTINO
  6.   SET DESTINO.txt = COMPLETA.txt,
  7.       DESTINO.orden = COMPLETA.orden,
  8.       DESTINO.admitepedidos = COMPLETA.admitepedidos,
  9.       DESTINO.email = COMPLETA.email
  10. FROM (SELECT ORIGEN.empresa, ORIGEN.alm, ORIGEN.txt, ORIGEN.orden, ORIGEN.admitepedidos, ORIGEN.email
  11.         FROM [SERVIDOR_SQL_SERVER].[dbo].[almacen] ORIGEN
  12.    LEFT JOIN OPENQUERY(SERVIDOR_MYSQL,'SELECT empresa, alm, txt, orden, admitepedidos, email FROM SERVIDOR_MYSQL.almacen') AS DESTINO
  13.           ON (ORIGEN.empresa = DESTINO.empresa AND ORIGEN.alm COLLATE Modern_Spanish_100_CI_AS = DESTINO.alm COLLATE Modern_Spanish_100_CI_AS)
  14.        WHERE (DESTINO.empresa IS NOT NULL AND DESTINO.alm IS NOT NULL)
  15.          AND ((DESTINO.txt COLLATE Modern_Spanish_100_CI_AS <> ORIGEN.txt COLLATE Modern_Spanish_100_CI_AS)
  16.           OR (DESTINO.orden <> ORIGEN.orden)
  17.           OR (DESTINO.admitepedidos <> ORIGEN.admitepedidos)
  18.           OR (DESTINO.email COLLATE Modern_Spanish_100_CI_AS  <> ORIGEN.email COLLATE Modern_Spanish_100_CI_AS))) AS COMPLETA
  19. WHERE (COMPLETA.empresa = DESTINO.empresa AND COMPLETA.alm COLLATE Modern_Spanish_100_CI_AS = DESTINO.alm COLLATE Modern_Spanish_100_CI_AS);

Cuando hacía el update sobre registros en los que no se cambiaba nada, es decir que los campos de la tabla origen tenía los mismos valores que los de la tabla destino, se producía el archiconocido error, pero al añadir las líneas:

Código SQL:
Ver original
  1. ...
  2.           OR (DESTINO.orden <> ORIGEN.orden)
  3.           OR (DESTINO.admitepedidos <> ORIGEN.admitepedidos)
  4.           OR (DESTINO.email COLLATE Modern_Spanish_100_CI_AS  <> ORIGEN.email COLLATE Modern_Spanish_100_CI_AS)))

funciona todo correcto. Si existían registros en los que si se hacía el update de los datos, no me daba error alguno.

También resulta curioso que cuando hago un update directamente sobre la tabla almacen de la base de datos de mysql desde el workbenchy y los campos a actualizar tienen el mismo valor que los campos destino, secillamente dice: 0 rows afected, pero no da ningún error.

En fin, seguro que existen soluciones mejores, pero es lo único que he podido hacer.