【问题标题】:How to pass the results of a local MSSQL query into the query string for a linked MySQL database如何将本地 MSSQL 查询的结果传递到链接 MySQL 数据库的查询字符串中
【发布时间】:2019-03-11 18:07:14
【问题描述】:

背景

我正在开发一个基于远程 MySQL (v8) 数据库的内容生成文档的项目。为此,该程序使用本地 MSSQL (2017) 数据库和远程 MySQL 数据库的链接。

问题

我需要根据来自 MSSQL 的查询内容更新 MySQL 数据库,如下所示:

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

但是,每次我尝试此操作时,都会在以下位置引发错误:

    (LocalMSSQLDB.LocalTable.ID)

问题

有没有办法将本地查询的结果传递给远程数据库的查询字符串?

或者,有没有推荐的不同方法?

提前致谢。

【问题讨论】:

    标签: mysql sql sql-server sql-update linked-server


    【解决方案1】:

    您正在尝试访问 MySQL 服务器上 LocalMSSQLDB.LocalTable.ID 的值。这是不可能的。

    您可以使用变量来计算语句。 在下面的示例中,我为数据库和字段使用了一些其他名称。但是您应该了解总体思路。通过使用 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) 返回一个字符串。如果本地表包含 ID 的 1 和 2,则结果将为 1, 2。与'UPDATE test.test set text=''updated'' WHERE ID in ('');' 连接,最终结果将是:

    UPDATE test.test set text='updated' WHERE ID in (1, 2);
    

    当它被发送到名为 MYSQL2 的 MySQL 服务器时,你会得到想要的结果。

    在你的服务器上它会是这样的:

    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 中为您的所有 id 腾出空间。 200 个字符可能不够。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多