我有 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(current db) 上的数据,所以我这样做了:
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'.
我不明白,我确实使用了别名,为什么它告诉我 Ambiguous columns?我该如何解决?
编辑:我找到了一种让它工作的方法(见我的回答)——但仍然不明白为什么我需要在 where
子句中使用完整的表前缀。 - 并且不能使用别名来防止歧义
最佳答案
试试这个:
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
解释:
仅对其中一个表使用别名是不够的。
由于两个表具有相同的名称和相同的列名,
您还需要为目标表指定别名,并为其列使用多部分名称。
此外,您正在使用隐式连接。由于显式连接更具可读性,我建议永远不要使用隐式连接。
关于sql-server - 在 SQL Server 中使用远程服务器更新时列不明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30907993/