与SQL Server中的远程服务器更新时不明确的列?

时间:2015-06-18 06:29:19

标签: sql-server sql-server-2008-r2

我有2台SQL服务器。

  • dstest\mssql2008< - 我目前正在此实例(服务器)
  • dstrn< - 另一台服务器

两台服务器都有相同的表:

EServices_Pages_Content

目标:我需要更新来自dstrn的数据

在当前服务器上(dstest)我有:

enter image description here

可以(!)从dstest访问dstrn

SELECT * FROM dstrn.weberp.dbo.EServices_Pages_Content WHERE pageid=80

enter image description here

好的。

问题出在哪里?

正如我所说,我需要从远程服务器(dstrn)更新dstest(当前数据库)的数据,所以我这样做:

UPDATE EServices_Pages_Content
SET    [Content]              =  a.Content
FROM   [dstrn].weberp.dbo.EServices_Pages_Content a
WHERE  PageID                 = a.pageID
       AND MasterEntityID     = a.masterEntityid
       AND LanguageID         = a.LanguageID
       AND PageID             = 80

但是我收到了一个错误:

Msg 209, Level 16, State 1, Line 4
Ambiguous column name 'PageID'.
Msg 209, Level 16, State 1, Line 5
Ambiguous column name 'MasterEntityID'.
Msg 209, Level 16, State 1, Line 6
Ambiguous column name 'LanguageID'.
Msg 209, Level 16, State 1, Line 7
Ambiguous column name 'PageID'.

我不明白,我确实使用了别名,为什么它会告诉我不明确的列?我该如何解决?

编辑:我找到了一种让它工作的方法(请参阅我的回答) - 但仍然无法理解为什么我需要where子句中的完整表前缀。 - 并且不能使用别名来防止歧义

3 个答案:

答案 0 :(得分:3)

试试这个:

UPDATE Dest
SET    [Content] = a.Content
FROM   EServices_Pages_Content Dest 
INNER JOIN [dstrn].weberp.dbo.EServices_Pages_Content a
    ON Dest.PageID = a.pageID
    AND Dest.MasterEntityID = a.masterEntityid
    AND Dest.LanguageID = a.LanguageID
WHERE a.PageID = 80

<强>解释
仅在其中一个表上使用别名是不够的 由于两个表都具有相同的名称和相同的列名, 您还需要为目标表指定别名,并为其列使用多部分名称。
此外,您正在使用隐式连接。由于显式连接更具可读性,我建议永远不要使用隐式连接。

答案 1 :(得分:2)

我创建了2个测试表(在同一台服务器上):

memcache_broker

enter image description here

testA

enter image description here

现在,为简单起见,我想说我想从tableB更新tableA,但仅限于testB

首先我尝试了:

pageId=2

但我收到了一个错误:

UPDATE testA a
SET    a.[Content] = b.Content
FROM   testB b
WHERE  a.PageID = b.pageID
       AND a.PageID = 2

然后我尝试了:

Msg 102, Level 15, State 1, Line 6
Incorrect syntax near 'a'.

然后:

UPDATE testA   
SET    [Content] = b.Content
FROM   testB b
WHERE  testA.PageID = b.pageID -- notice  prefix
       AND  testA.PageID = 2 -- notice  prefix

现在你可以看到它没关系:

enter image description here

答案 2 :(得分:1)

你需要一些加入:

UPDATE  d
SET     [Content] = a.Content
FROM    EServices_Pages_Content d
        JOIN [dstrn].weberp.dbo.EServices_Pages_Content s ON d.PageID = s.pageID
                                                             AND d.MasterEntityID = s.masterEntityid
                                                             AND d.LanguageID = s.LanguageID
                                                             AND d.PageID = 80