【问题标题】:multi part identifier could not be bound sql多部分标识符无法绑定sql
【发布时间】:2016-12-05 09:05:37
【问题描述】:

我在以下查询中得到 multipart can't be bound 错误

update nfltx
set 
b.boxno = a.boxno,
b.message = a.message,
b.nameboxno = a.nameboxno,
b.namemsg = a.namemsg,
b.phoneboxno = a.phoneboxno,
b.phonemsg = a.phonemsg

FROM ofltx a JOIN nfltx b 
ON a.ls_fullnam = b.ls_fullnam

但是如果我从 boxno 消息中删除 b 并且我没有得到错误。这背后的原因是什么。感谢您使用 sql server 2008

【问题讨论】:

  • 使用您在update 部分中为nfltx (AS b) 指定的表别名。这应该可以解决问题。我认为当您混合表名和潜在别名时会发生这种情况......
  • @Killercam - 你的意思是把查询写成 UPDATE nfltx AS b SET...?我认为这是不允许的。

标签: sql sql-server tsql


【解决方案1】:

在 FROM 子句中指定的表别名不能用作 SET column_name 中的限定符。这是无效的:

update nfltx
set 
b.boxno = a.boxno,
b.message = a.message,
b.nameboxno = a.nameboxno,
b.namemsg = a.namemsg,
b.phoneboxno = a.phoneboxno,
b.phonemsg = a.phonemsg

FROM ofltx a JOIN nfltx b 
ON a.ls_fullnam = b.ls_fullnam

要使其正常工作,请删除 b。列名的别名。

update nfltx
set 
boxno = a.boxno,
message = a.message,
nameboxno = a.nameboxno,
namemsg = a.namemsg,
phoneboxno = a.phoneboxno,
phonemsg = a.phonemsg

FROM ofltx a JOIN nfltx b 
ON a.ls_fullnam = b.ls_fullnam

拉吉

【讨论】:

  • 是否有任何官方文档提及此类约定?
【解决方案2】:

这背后的原因是什么?

UPDATE(和DELETEINSERT)可以影响一个表,而且只能影响一个表。您已在此处确定要影响哪个表:

update nfltx

因此,意义SET 子句中允许赋值左侧的别名是没有意义的。它们必须是属于先前标识的表的列。

如果同一表多次包含在FROM 子句中(并且它是您要更新的表),您需要提供一个别名来指示要更新的表的哪个实例 - 但您d 在UPDATE 子句中而不是在SET 子句中提供它(一次)。

【讨论】:

  • 我更喜欢你的回答,因为你解释了为什么它不起作用。
【解决方案3】:

随便用

update b 

而不是

update nfltx

伙计们,你们让正在学习的人太难了。

【讨论】:

    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 2022-11-19
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多