将SQL MERGE应用到远程(链接)服务器表

15

是否可以在链接服务器的数据库表上使用SQL MERGE功能?最终目标是将远程表与本地SQL服务器表同步。我在网上做了一些研究,但没有找到任何相关信息。如果可能,您将如何设置源和目标语句?


1
你的意思是这个表在一个连接服务器上吗?目标表在哪里?根据Merge 的说明: “target_table 不能是远程表。” - Mikael Eriksson
是的,已经链接了。它位于佛罗里达州,在康涅狄格州的我这边。 - devHead
如果你想从CT合并到FL,那么你不能使用merge - Mikael Eriksson
真遗憾...这是一个很好、很容易的功能... - devHead
1
我在哪里可以找到相关文档? - devHead
显示剩余2条评论
4个回答

23

重申@Mikael Eriksson的评论,是的,你可以这样做。MERGE语句的目标不能是远程的,但是MERGE语句的源头可以是远程的。所以,如果你可以在FL服务器上运行MERGE语句,那么这是完全可能的。例如,你可以在FL的远程服务器上运行类似这样的语句:

MERGE INTO "local FL table" USING "CT server"."database"."schema"."same table" ON ...

谢谢你提到了这个,当我看到合并无法在远程目标上运行的错误时,我以为遇到了绝境,但是通过你的回答我得到了提示,可以切换服务器并在主服务器上执行查询,结果完美解决了。 - Niklas

6
显然,我的研究不够充分,MSDN 上明确说明:“target_table 不能是远程表”,这就回答了这个问题。

1
如果我不打算将它用于远程表,那么它就是一半没用的!这就像走了1000英里的路程,在走到第500英里后不得不放弃你的汽车开始步行。 - Subliminal Hash
1
如果您查看merge的文档(https://learn.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-2017),则目标不能是远程表。但源可以是远程表。因此,您可以从源中“拉取”数据,但无法将数据“推送”到目标。 - rrozema

1

这不是对该问题的确切回答,而是更新链接服务器中远程表的替代方法。

UPDATE [RemoteItem] 
SET    [RemoteItem].[AccountID] = [I].[AccountID] 
FROM   OPENQUERY
(
    [LINKEDSERVER],
    'select AccountID from [RemoteDb].dbo.[Item]'
) [RemoteItem] 
INNER JOIN [LocalDB].[dbo].[Item] AS [I] 
    ON p.ProductID = oq.ProductID 

请参考此链接

未经测试。


我必须要赞赏你,因为我从来没有想到这个方法会有效,但它是唯一解决我尝试从本地临时表选择更新远程表的问题的方法。 - undefined

-1

您可以在服务器上始终使用EXEC('SQL CODE HERE')AT YOUR_LINKED_SERVER,可能作为存储过程。

这将在链接的服务器上执行所需的查询,以便将本地表(target_table)与服务器表(source)合并。

这是我在服务器中使用的存储过程代码,客户端从服务器执行存储过程 -> 服务器执行查询,以使用相同的信息(员工)更新不同的链接服务器(客户端)。

    EXEC('
SET IDENTITY_INSERT PVBC.DBO.empleadas ON

MERGE INTO PVBC.DBO.empleadas A
USING(
    SELECT id_empleada, nombre, apellidos
    FROM SERVIDOR.PVBC_SERVIDOR.DBO.empleadas) TA
ON (A.id_empleada =TA.id_empleada)
WHEN MATCHED THEN
UPDATE 
    SET A.nombre=TA.nombre,
        A.apellidos=TA.apellidos
WHEN NOT MATCHED THEN

    INSERT 
        (id_empleada, nombre, apellidos)
    VALUES
        (id_empleada, nombre, apellidos);

SET IDENTITY_INSERT PVBC.DBO.empleadas OFF
')AT MEGA --This is one of my linked servers

1
但是这需要目标服务器将源服务器作为链接服务器,这并不总是可能或理想的。从某种意义上说,这只是将问题反转了。 - underscore_d
@EdgarHolguin 提醒您,如果未启用远程服务器的RPC调用,则上述操作将无法正常工作。 - ha9u63a7
完美运作,不确定为什么你被踩了。这是一个理想的解决方案。显然,服务器必须链接并设置RPC,但如果您无法设置这些基本先决条件,那么您可能不应该首先尝试合并跨服务器。 - Geoff Griswald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接