Sql server SQL Server错误:前缀的最大数目。最大值为3。使用连接语法

Sql server SQL Server错误:前缀的最大数目。最大值为3。使用连接语法,sql-server,sql-server-2000,linked-server,Sql Server,Sql Server 2000,Linked Server,正在尝试运行跨服务器更新: UPDATE ASILIVE.CustomerManagementSystem.dbo.Sessions SET ASILIVE.CustomerManagementSystem.dbo.Sessions.VarianceAmount=Variances.VarianceAmount FROM ASILIVE.CustomerManagementSystem.dbo.Sessions INNER JOIN Variances ON ASILIVE.Cu

正在尝试运行跨服务器更新:

UPDATE ASILIVE.CustomerManagementSystem.dbo.Sessions
SET ASILIVE.CustomerManagementSystem.dbo.Sessions.VarianceAmount=Variances.VarianceAmount
FROM ASILIVE.CustomerManagementSystem.dbo.Sessions
    INNER JOIN Variances
    ON ASILIVE.CustomerManagementSystem.dbo.Sessions.SessionGUID = Variances.SessionGUID
WHERE ASILIVE.CustomerManagementSystem.dbo.Sessions.VarianceAmount <> Variances.VarianceAmount
有什么好处


另见

  • (处理子选择语法;此问题处理联接语法)

不重要的研究:

我尝试随机将内容别名为
s

UPDATE ASILIVE.CustomerManagementSystem.dbo.Sessions s
SET s.VarianceAmount=Variances.VarianceAmount
FROM ASILIVE.CustomerManagementSystem.dbo.Sessions s
    INNER JOIN Variances
    ON s.SessionGUID = Variances.SessionGUID
WHERE s.VarianceAmount <> Variances.VarianceAmount
哈姆林建议增加括号:

UPDATE [ASILIVE].[CustomerManagementSystem].dbo.Sessions
SET [ASILIVE].[CustomerManagementSystem].dbo.Sessions.DisciplineVarianceAmount=DisciplineVariances.VarianceAmount
FROM [ASILIVE].[CustomerManagementSystem].dbo.Sessions
    INNER JOIN DisciplineVariances
    ON [ASILIVE].[CustomerManagementSystem].dbo.Sessions.SessionGUID = DisciplineVariances.SessionGUID
WHERE [ASILIVE].[CustomerManagementSystem].dbo.Sessions.DisciplineVarianceAmount <> DisciplineVariances.VarianceAmount

通常,您至少需要在链接服务器名称周围添加括号

[ASILIVE].[CustomerManagementSystem].dbo.Sessions
编辑-另外尝试此操作

UPDATE S
SET DisciplineVarianceAmount = Variances.VarianceAmount
FROM [ASILIVE].[CustomerManagementSystem].dbo.Sessions as S
    INNER JOIN Variances ON S.SessionGUID = Variances.SessionGUID
WHERE S.VarianceAmount <> Variances.VarianceAmount
updates
设置DistrictEvarianceAmount=Variances.VarianceAmount
来自[ASILIVE]。[CustomerManagementSystem].dbo.Sessions作为
S.SessionGUID上的内部联接变量=Variances.SessionGUID
其中S.VarianceAmount Variances.VarianceAmount

你真的喜欢大量打字吗?:-)

updates
设置s.DistrictEvarianceAmount=v.VarianceAmount
来自[ASILIVE]。[CustomerManagementSystem].dbo.Sessions作为
内部联接dbo.方差为v
在s.SessionGUID=v.SessionGUID上
和s.VarianceAmount v.VarianceAmount;

请注意,如果差异金额当前为
NULL

我不知道您可以在
更新
部分中使用别名,您可能需要在此处描述如何操作。虽然你先给出了一个(不正确的)答案,但我要把它交给亚伦。这不仅仅是因为他的(正确的)答案出现在您的更新之前,而是因为他的版本指出您可以继续在
SET
部分使用别名(这正是我拼命想要做的)。虽然你比他更需要代表,但公平地说,他首先得到了正确的答案。+1如果没有其他原因(除了正确),那么当其他人的答案几乎相同/同时被选中时就很难了。你也一样!我很想删除我的答案,因为它包含一些冗余信息,但我看到这个错误在我答案的第一部分被消除了。可能对路人有用。引用链接服务器有时会感觉语法上是随机的,我认为只有当您实际将链接服务器命名为类似于
foo.bar
;话虽如此,引用FQDN甚至IP或web地址可能是很常见的,例如,我见过链接服务器的形式为
foo.bar.com\instance
…我更喜欢有用的表名和列名。与AS/400的6个字符的列名形成对比,其中两个是保留的——只留下4个字符的列名(例如,
PFNMCN
)@Ian Boyd:我想你使用AS/400的经历应该可以解释你对长名称的喜爱。对于你的打字能力来说,这一定是非常幸运的,因为当你的思维快速流动时,你想快速打字,而必须键入长标识符使你更快地获得快速打字能力顺便说一句,等号左边的集合语句中不需要别名,因为它必须是更新中列出的表中的字段。SET-StrictiveVarianceAmount=v.VarianceAmount也可以。@HLGEM虽然为true,但我更喜欢显式地保存两次击键。自我文档化代码,特别是对于不熟悉SQL Server专有更新语法的用户来说,是值得的。我发现另一种形式对我来说更有意义,而且更易于阅读。显然,微软也是如此,因为他们通常不会在网上书籍的示例中使用别名,这也是我学习使用的表单的地方。但这两种形式都非常有效,它们的使用是个人偏好或公司风格。
Msg 117, Level 15, State 2, Line 5
The number name 'ASILIVE.CustomerManagementSystem.dbo.Sessions' contains
more than the maximum number of prefixes. The maximum is 3.
[ASILIVE].[CustomerManagementSystem].dbo.Sessions
UPDATE S
SET DisciplineVarianceAmount = Variances.VarianceAmount
FROM [ASILIVE].[CustomerManagementSystem].dbo.Sessions as S
    INNER JOIN Variances ON S.SessionGUID = Variances.SessionGUID
WHERE S.VarianceAmount <> Variances.VarianceAmount
UPDATE s
  SET s.DisciplineVarianceAmount = v.VarianceAmount
  FROM [ASILIVE].[CustomerManagementSystem].dbo.Sessions AS s
  INNER JOIN dbo.Variances AS v
  ON s.SessionGUID = v.SessionGUID
  AND s.VarianceAmount <> v.VarianceAmount;