2016-01-07 51 views
-2

我想知道是否有任何其他的替代方法,而不是使用此连接来执行远程更新。我是使用链接服务器的新手,并且我已经读过连接可能表现不佳(取决于实现)。作为参考,本地表很小,远程表很大,它们都有相同的模式和表名。SQL Server远程更新替代方案

[更新]

  • 补充说明的是,表名和模式是相同的。
  • 增加执行计划。

这工作:

UPDATE remoteTable 
SET remoteTable.[Data] = mylocalTable.[Data] 
FROM [RemoteServer].[MyDatabase].[dbo].[MyTable] remoteTable 
INNER JOIN [dbo].[MyTable] myLocalTable ON (remoteTable.[Id] = myLocalTable.[Id]) 

Execution plan

这些不工作。我试过以下查询并得到这些错误。

UPDATE [RemoteServer].[MyDatabase].[dbo].[MyTable] 
SET [Data] = [dbo].[MyTable].[Data] 
FROM [dbo].[MyTable] 
WHERE [Id] = [dbo].[MyTable].[Id]) 

的对象 “RemoteServer.MyDatabase.dbo.MyTable” 和 “dbo.MyTable” 在FROM子句中具有相同的名称曝光。使用相关名称来区分它们。

UPDATE [RemoteServer].[MyDatabase].[dbo].[MyTable] 
SET [Data] = mylocalTable.[Data] 
FROM [dbo].[MyTable] myLocalTable 
WHERE [Id] = myLocalTable.[Id]) 

不明确的列名 '身份证'。

UPDATE [RemoteServer].[MyDatabase].[dbo].[MyTable] 
SET [Data] = mylocalTable.[Data] 
FROM [dbo].[MyTable] myLocalTable 
WHERE ([RemoteServer].[MyDatabase].[dbo].[MyTable].[Id] = myLocalTable.[Id]) 

多部分标识符 “RemoteServer.MyDatabase.dbo.MyTable.Id” 不能被约束。

MERGE [RemoteServer].[MyDatabase].[dbo].[MyTable] remoteTable 
USING [dbo].[MyTable] localTable ON (remoteTable.[Id]=localTable.[Id]) 
WHEN MATCHED THEN 
    UPDATE 
     SET [Data] = localTable.[Data] 
; 

一个MERGE语句的目标不能是远程表,远程视图,或在远程表的图。

+1

“'我是新来的使用链接服务器,我读过连接可能表现不佳” - 所以,你的表现如何? –

+0

不知道为什么你热衷于去除连接。看起来你需要做的就是修复那些相当简单的语法问题,而且你很好。 – usr

+0

我很好地使用连接我只想知道是否有更好的方法来做到这一点,或者我可以将它与之进行比较。 @usr你能帮我解决语法问题吗? AFAIK只能在from子句中使用表别名来进行更新,因此只留下一个连接。我不确定如何解决多部分标识符问题。 – user3811205

回答

0

这是否运行?

UPDATE RemoteServer.MyDatabase.dbo.MyTable 
SET Data = (
    SELECT Data 
    FROM myLocalTable lt 
    WHERE lt.Id = MyTable.Id 
) 

我不确定两个服务器之间的表名是否相同。确保在查询内部使用别名,并在不使用四部分名称的情况下引用相关性中的更新表。

+0

表名是相同的。您的查询会运行,但会更新远程表中的每一行。 – user3811205

+0

您可以使用旧值或“where exists”添加'coalesce',以防止更新太多的行。虽然你没有多说关于这个问题中表格之间的关系。 – shawnt00

+0

是的,我想我忽略了一些细节。我可以让这个查询工作,但是如果我必须更新远程服务器上的多个列,我认为它不会执行连接。我想我会关闭这个问题并尝试更好地理解远程更新的实际工作方式。感谢您的帮助。 – user3811205