sql-server - 在 SQL Server 中使用远程服务器更新时列不明确?

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

我有 2 个 SQL 服务器。

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

两台服务器都有同一张表:

EServices_Pages_Content

目标:我需要从 dstrn

dstest 更新数据

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

enter image description here

可以(!)从 dstest 访问 dstrn:

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

enter image description here

好的。

那么问题出在哪里呢?

正如我所说,我需要从远程服务器 (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/

相关文章:

sql-server - 进程/SPID被自身阻塞,如何在不重启Sql Server的情况下清除/杀死

sql - 值为 NULL 的列会影响 Microsoft SQL Server 的性能吗?

sql-server - 在查询中定义的列别名如何在sql server中的同一个查询中使用where子句

sql - 如何使用不同的自定义生成的主键 SQL Server 插入重复记录

sql - 在 SQL 中为表行设置限制

TSQL:FOR XML PATH ('')无法分组

sql-server - 我可以更改作为表加载到 SQL Server 的 Spark 数据框列的数据类型吗?

sql-server - 检测.NET中的无线网络状态变化

java - 将时间戳从远程sql服务器获取到本地mysql的数据上

sql - 无法用 SQL UNION 查询替换表名