Как передать результаты локального запроса MSSQL в строку запроса для связанной базы данных MySQL - PullRequest
0 голосов
/ 06 октября 2018

Фон :

Я работаю над проектом, который генерирует документы на основе содержимого удаленной базы данных MySQL (v8).Для этого программа использует локальную базу данных MSSQL (2017) со ссылкой на удаленную базу данных MySQL.

Issue :

Мне нужно обновить базу данных MySQLосновываясь на содержимом запроса из MSSQL следующим образом:

    EXEC('UPDATE LinkedMySQLDB.TableToUpdate AS a SET a.MySQLField=''updated'' WHERE a.ID IN (LocalMSSQLDB.LocalTable.ID) ;') AT LinkedMySQLServer

Однако, каждый раз, когда я пытаюсь это сделать, выдается сообщение об ошибке:

    (LocalMSSQLDB.LocalTable.ID)

Вопрос :

Есть ли способ передать результаты локального запроса в строку запроса для удаленной базы данных?

Или есть другой подход, который рекомендуется?

Заранее спасибо.

1 Ответ

0 голосов
/ 07 октября 2018

Вы пытаетесь получить доступ к значениям 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 символов может быть недостаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...