2016-06-12 619 views
-2

我正在使用此代码,但上面显示了错误消息。为什么这么做? 我还创建链接的服务器到第二的PC链接名称= 192.168.1.101还用户名= XXXX和密码= XXXXMERGE语句必须以分号(;)结尾

WITH Source AS 
    (SELECT id, name FROM Tamio.dbo.memberform WHERE active = 1 or active =0) 
MERGE INTO [192.168.1.101].Imatismos.dbo.customermaster AS target 
    USING Source ON target.id = source.id 
    WHEN MATCHED THEN UPDATE SET target.name = source.name 
    WHEN NOT MATCHED THEN INSERT (id, name) VALUES (source.id, source.name) 
+2

当目标表是远程表时,不能使用合并。不确定此限制是否已在Sql Server 2014/2016中解除,但就Sql Server 2012而言,这在MSDN中进行了说明。在这一点上,我建议放弃合并方法,并使用一个存储过程与单独的步骤来执行您的UPDATE或INSERT – Steve

+0

有没有其他办法,我可以成功呢? – user6453809

+0

将所有表格转移到另一台PC-B(远程)表格并将两张表格合并到PC-B中是否正确? – user6453809

回答

-1

一种方法是你的所有源数据复制到staging table并随后对其进行处理:

1)复制数据

INSERT INTO Imatismos.stg.memberform 
SELECT id, name 
FROM Tamio.dbo.memberform WHERE active = 1 or active = 0 

2)实际的合并可以在本地进行(这是运行在[192.168.1.101] .Imatismos)

WITH Source AS 
    (SELECT id, name FROM stg.memberform) 
MERGE INTO dbo.customermaster AS target 
    USING Source ON target.id = source.id 
WHEN MATCHED THEN UPDATE SET target.name = source.name 
WHEN NOT MATCHED THEN INSERT (id, name) VALUES (source.id, source.name); 

一般来说,尽量避免runn在多个服务器上“加入”的查询,因为这可能会导致非常差的性能。

+1

这不是所问问题的答案。如果OP有跟进问题,他们应该问一个新问题。 –

3

在您的合并声明的末尾加上一个分号!

WITH Source AS 
    (SELECT id, name FROM Tamio.dbo.memberform WHERE active = 1 or active =0) 
MERGE INTO [192.168.1.101].Imatismos.dbo.customermaster AS target 
    USING Source ON target.id = source.id 
    WHEN MATCHED THEN UPDATE SET target.name = source.name 
    WHEN NOT MATCHED THEN INSERT (id, name) VALUES (source.id, source.name); 
+0

现在我收到以下消息:MERGE语句的目标不能是远程表,远程视图或远程表上的视图。 – user6453809

+0

阅读文档:https://msdn.microsoft.com/en-US/library/bb510625.aspx - > * target_table不能是一个远程表。* –

+1

@ user6453809这是一个不同的问题,问一个关于SO的问题'创建某种帮助台,人们可以在其中解决所有相关问题。 –

相关问题