2017-08-07 37 views
0

我試圖在鏈接服務器上的表上執行更新,其中來自當前服務器上的表的信息以及查詢正在進行2小時更新一個測試行,這裏是我的查詢使用select語句在linkedserver表上執行更新

UPDATE OPENQUERY (LINKEDSERVER, 'SELECT FIELD1, FIELD2, FIELD3, FIELD4 FROM 
SPV.DBO.TESTTABLE') 
SET FIELD1 = LT.FIELD1, 
    FIELD2 = LT.FIELD2, 
    FIELD3 = LT.FIELD3, 
    FIELD4 = LT.FIELD4 
FROM OPENQUERY (LINKEDSERVER, 'SELECT FIELD1, FIELD2, FIELD3, FIELD4 FROM 
SPV.DBO.TESTTABLE') L 
INNER JOIN LOCALTESTTABLE LT ON LT.FIELD1 = L.FIELD1 COLLATE 
Latin1_General_CI_AS  
AND LT.FIELD2 = L.FIELD2 COLLATE Latin1_General_CI_AS 

回答

0

這是否適合您?

UPDATE L 
    SET FIELD1 = LT.FIELD1, 
     FIELD2 = LT.FIELD2, 
     FIELD3 = LT.FIELD3, 
     FIELD4 = LT.FIELD4 
FROM LINKEDSERVER.SPV.DBO.TESTTABLE INNER JOIN 
    LOCALTESTTABLE LT 
    ON LT.FIELD1 = L.FIELD1 COLLATE Latin1_General_CI_AS AND 
     LT.FIELD2 = L.FIELD2 COLLATE Latin1_General_CI_AS; 

四部分命名比OPENQUERY()簡單。

你的版本可能也行,但你需要使用的別名update

UPDATE L 
    SET FIELD1 = LT.FIELD1, 
     FIELD2 = LT.FIELD2, 
     FIELD3 = LT.FIELD3, 
     FIELD4 = LT.FIELD4 
FROM OPENQUERY (LINKEDSERVER, 'SELECT FIELD1, FIELD2, FIELD3, FIELD4 FROM 
SPV.DBO.TESTTABLE') L INNER JOIN 
    LOCALTESTTABLE LT 
    ON LT.FIELD1 = L.FIELD1 COLLATE Latin1_General_CI_AS AND 
     LT.FIELD2 = L.FIELD2 COLLATE Latin1_General_CI_AS ; 

否則,要更新表中的所有行。

+0

是的,它的工作原理,但我忘了在原來的帖子上說我試圖用openquery來做這件事的原因是因爲原來的代碼目前正在執行四部分命名,但需要很長時間爲了完成,我被要求做這個改變來提高性能。 – Rafaetti

+0

感謝您的幫助,問題是失蹤的別名! – Rafaetti