Вы пытаетесь получить доступ к значениям LocalMSSQLDB.LocalTable.ID на сервере MySQL.Это невозможно.
Вы можете использовать переменную для вычисления выписки.В приведенном ниже примере я использую некоторые другие имена для баз данных и полей.Но вы должны получить общее представление.Используя concat, я объединяю текстовые части с результатом подзапросов, преобразованных в список через запятую, используя STRING_AGG.
declare @strSQL varchar(200);
select @strSQL=concat('UPDATE test.test set text=''updated'' WHERE ID in (',(SELECT STRING_AGG(ID, N', ') FROM [SQLTest].dbo.tblTest),');');
EXEC(@strSQL) AT MYSQL2;
Эта часть (SELECT STRING_AGG(ID, N', ') FROM [SQLTest].dbo.tblTest)
возвращает строку.Если локальная таблица содержит идентификаторы 1 и 2, результат будет 1, 2
.Объединенный с 'UPDATE test.test set text=''updated'' WHERE ID in ('
и ');'
, конечный результат будет:
UPDATE test.test set text='updated' WHERE ID in (1, 2);
Когда он будет отправлен на сервер MySQL с именем MYSQL2, вы получите желаемый результат.
На ваших серверахэто будет что-то вроде:
declare @strSQL varchar(200);
select @strSQL=concat('LinkedMySQLDB.TableToUpdate AS a SET a.MySQLField=''updated'' WHERE ID in (',(SELECT STRING_AGG(ID, N', ') FROM LocalMSSQLDB..LocalTable),');');
EXEC(@strSQL) AT LinkedMySQLServer;
Обязательно освободите место для всех ваших идентификаторов в @strSQL.200 символов может быть недостаточно.