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 originalWITH DESTINO AS (
SELECT empresa, alm, txt, orden, admitepedidos, email
FROM OPENQUERY(SERVIDOR_MYSQL, 'SELECT empresa, alm, txt, orden, admitepedidos, email FROM SERVIDOR_MYSQL.almacen')
)
UPDATE DESTINO
SET DESTINO.txt = COMPLETA.txt,
DESTINO.orden = COMPLETA.orden,
DESTINO.admitepedidos = COMPLETA.admitepedidos,
DESTINO.email = COMPLETA.email
FROM (SELECT ORIGEN.empresa, ORIGEN.alm, ORIGEN.txt, ORIGEN.orden, ORIGEN.admitepedidos, ORIGEN.email
FROM [SERVIDOR_SQL_SERVER].[dbo].[almacen] ORIGEN
LEFT JOIN OPENQUERY(SERVIDOR_MYSQL,'SELECT empresa, alm, txt, orden, admitepedidos, email FROM SERVIDOR_MYSQL.almacen') AS DESTINO
ON (ORIGEN.empresa = DESTINO.empresa AND ORIGEN.alm COLLATE Modern_Spanish_100_CI_AS = DESTINO.alm COLLATE Modern_Spanish_100_CI_AS)
WHERE (DESTINO.empresa IS NOT NULL AND DESTINO.alm IS NOT NULL)
AND ((DESTINO.txt COLLATE Modern_Spanish_100_CI_AS <> ORIGEN.txt COLLATE Modern_Spanish_100_CI_AS)
OR (DESTINO.orden <> ORIGEN.orden)
OR (DESTINO.admitepedidos <> ORIGEN.admitepedidos)
OR (DESTINO.email COLLATE Modern_Spanish_100_CI_AS <> ORIGEN.email COLLATE Modern_Spanish_100_CI_AS))) AS COMPLETA
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...
OR (DESTINO.orden <> ORIGEN.orden)
OR (DESTINO.admitepedidos <> ORIGEN.admitepedidos)
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.