【问题标题】:SQL Server Error: maximum number of prefixes. The maximum is 3. with join syntaxSQL Server 错误:最大前缀数。最大值为 3. 使用连接语法
【发布时间】:2011-11-01 09:38:06
【问题描述】:

尝试运行跨服务器更新:

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

给出错误:

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.

什么给了?


另见


不重要的研究:

我尝试将事物随机别名为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

但这不起作用:

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.

Hamlin 建议添加括号:

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

但这不起作用:

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.

【问题讨论】:

    标签: sql-server sql-server-2000 linked-server


    【解决方案1】:

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

    [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
    

    【讨论】:

    • 我有 no 的想法,您可以在 UPDATE 部分使用别名。虽然您首先提供了一个(不正确的)答案,但我将把它交给 Aaron。不仅因为他的(正确)答案出现在您的更新之前,还因为他的版本指出您可以继续在 SET 部分使用别名(这是我拼命想要做的)。虽然你比他更需要代表,但公平地说,他首先得到了正确的答案。
    • + 1如果,没有其他原因(除了也是正确的),而不是在别人几乎相同/同时答案的情况下选择。 span>
    • 你也一样!我很想删除我的答案,因为它包含一些冗余信息,但我已经看到我的答案的第一部分消除了这个错误。可能对路人有用。引用链接的服务器有时会让人感觉语法随机
    • 我认为只有在您实际将链接服务器命名为 foo.bar; 时才会发生这种情况。话虽如此,引用 FQDN 甚至 IP 或 Web 地址可能很常见,例如我见过foo.bar.com\instance...形式的链接服务器...
    【解决方案2】:

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

    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;
    

    请注意,如果任一差异金额当前为 NULL,您可能需要在此处描述要执行的操作。

    【讨论】:

    • 我更喜欢有用的表名和列名。与 AS/400 的 6 个字符的列名相比,其中两个是保留的 - 留下四个字符的列名(例如 PFNMCN
    • @Ian Boyd:我想您使用 AS/400 的经验应该可以解释您对长名称的喜爱。而且你的打字能力一定很幸运,因为有时当你的想法快速流动时,你想快速打字,而不得不输入长标识符会让你更快地获得快速打字。 :)
    • 顺便说一句,您不需要等号左侧的集合语句中的别名,因为它必须是更新中列出的表中的字段。 SET DisciplineVarianceAmount = v.VarianceAmount 也可以。
    • @HLGEM 虽然是这样,但我更喜欢明确而不是保存两次击键。自记录代码,特别是对于不熟悉 SQL Server 专有更新语法的用户而言,是有回报的。
    • 我发现另一种形式对我来说更有意义并且更易于阅读。显然微软也是如此,因为他们通常不会在联机丛书中的示例中使用别名,这是我学习使用表格的地方。但是这两种形式都非常好用,它们的使用是个人喜好或公司风格。
    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2014-11-18
    相关资源
    最近更新 更多