我有2台SQL服务器。
dstest\mssql2008
< - 我目前正在此实例(服务器)dstrn
< - 另一台服务器两台服务器都有相同的表:
EServices_Pages_Content
目标:我需要更新来自dstrn
的数据
在当前服务器上(dstest)我有:
我可以(!)从dstest访问dstrn
:
SELECT * FROM dstrn.weberp.dbo.EServices_Pages_Content WHERE pageid=80
好的。
问题出在哪里?
正如我所说,我需要从远程服务器(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
子句中的完整表前缀。 - 并且不能使用别名来防止歧义
答案 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
表testA
现在,为简单起见,我想说我想从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
现在你可以看到它没关系:
答案 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