2016-01-07 49 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