2017-08-07 39 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