【问题标题】:UPDATE local MSSQL table from Identical MySQL Linked Server Table Where Clause从相同的 MySQL 链接服务器表 Where 子句更新本地 MSSQL 表
【发布时间】:2014-06-22 04:45:06
【问题描述】:

我有两张表都命名为雇主。一个表位于 MSSQL 上,另一个位于 MySQL 上。 MySQL 数据库已链接。

我正在尝试使用数据不同的 MySQL DB 中的数据更新 MSSQL DB 表中的所有行。

理想情况下,由于行数太多,我宁愿只更新具有不同数据的行。

每个数据库表有 2 列 idemployees 和 employeescol1。

下面是一个脚本的工作示例,它将更新链接 MySQL 数据库中的所有行:

UPDATE MSSQLDB.dbo.employer
SET employeescol1 = emp2.employeescol1  
FROM OPENQUERY(LinkedServer, 'SELECT * FROM employees') as emp2  
WHERE
   MSSQLDB.dbo.employer.idemployees = emp2.idemployee

如何添加 WHERE 子句来表示 WHERE employeescol >= (insert variable)???

【问题讨论】:

    标签: mysql sql-server linked-server openquery


    【解决方案1】:

    这样的事情应该可以工作。你也可以使用同义词,如果 .... 有点多:

    ;with cte
    as
    (SELECT
        *
    from
       OPENQUERY(LinkedServer, 'SELECT * FROM employees')
    )
    UPDATE MSSQLDB.dbo.employer
    SET 
        employer.employeescol1 = cte.employeescol1  
    FROM
        MSSQLDB.dbo.employer 
    inner join
        cte
    on
        cte.idemployees = employer.idemployee
    

    【讨论】:

    • 太棒了!!它似乎工作......我标记为已解决之前的问题:这是一个示例数据库,实际数据库将具有大约。 500,000 行...我只想更新已更改的列... JOIN 是否确保这一点?上面的代码是如何工作的?我问的原因是因为当我执行脚本时,它始终显示相同数量的受影响行,即:(3 行受影响)
    • 在末尾添加 where 子句,即WHERE cte.col1 employer.col1 OR cte.col2 employer.col1 ......(注意 NULLS - 如果您认为列中可能有任何内容,那么 isnull(cte.col1, '' ) isnull(employer.col, ''), etc..
    • 如果您愿意,您还可以将其更改为 SELECT 以进行测试,并查看在放入 where 子句后会返回什么。然后当您开心时 - 开心更新。作为旁注,是否存在完全相同数量的记录,或者您是否需要满足新的和/或已删除的记录?如果是这样,很容易,只需使用左右连接执行相同的查询,以查看它们在任何一侧都不存在的位置。你知道的。
    • 没问题。与 CTE 一起玩,它们很棒。同义词也非常有用,但请记住它们是服务器范围的。
    • SO 周围有很多这样的东西。还订阅 SQLCentral - 每日文章 - 非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2016-08-15
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多