(已解决)The multi-part identifier “xxx“ could not be bound.

MS SQL错误:无法绑定由多个部分组成的标识符 "xxxxx"解决

如果赶时间的话 一句话了结 , 就是你在sql前面把数据库的表名指定了别名 , 后面并没有使用别名 , 就会报错

解决问题需要全部改成别名 或者直接不用

-- 下面例子会报错
select * from user u order by user.code

-- 正确表述
select * from user u order by u.code 
select * from user u order by code 
select * from user order by user.code

在数据库中 可以使用的sql在mybatis等框架就会出错
原SQL语句不便于说明问题,我用一个简单的例子来描述这个问题,请看下面SQL:

SELECT TYPE, COUNT(1) FROM sys.objects t GROUP BY sys.objects.type;

消息 4104,级别 16,状态 1,第 2 行
无法绑定由多个部分组成的标识符 “sys.objects.type”。
如果是English版本,则会报如下错误:
消息 4104,级别 16,状态 1,第 3 行
The multi-part identifier “sys.objects.type” could not be bound.

SQL脚本里面的查询对象sys.objects 使用了别名t,但是如果在GROUP BY 字段名上使用了表名,则会报如上错误。我试着使用了下面几种方式,结果都没有问题。

SELECT TYPE, COUNT(1) FROM sys.objects GROUP BY TYPE;

SELECT TYPE, COUNT(1) FROM sys.objects GROUP BY sys.objects.type;

SELECT TYPE, COUNT(1) FROM sys.objects t GROUP BY t.type;

SELECT TYPE, COUNT(1) FROM sys.objects t GROUP BY type;

我自己的解释(假设)是:因为对所要查询的表使用了别名,则SQL语句在解析的时候,例如上面报错的SQL,则会将GROUP BY sys.objects.type 解析成GROUP BY t.sys.objects.type; 这样就会导致编译器无法识别这个对象t.sys.objects.type。因为根本没有这样一列。但是就像我开篇所说那样,有种说不清道不明的感觉,感觉是这么回事,解释也似乎合理,但是总感觉缺乏说服力,于是我又设计了下面一个小例子:

DROP TABLE TEST;
SELECT * INTO TEST FROM sys.objects;
SELECT t.name FROM TEST t , sys.objects s WHERE t.object_id = s.object_id AND t.name ='Test'
SELECT t.name FROM TEST t , sys.objects s WHERE t.object_id = s.object_id AND TEST.name ='Test'

消息 4104,级别 16,状态 1,第 2 行
无法绑定由多个部分组成的标识符 “TEST.name”。

可以肯定的是,如果对表使用了别名,则在后面引用表中字段需要区别时,则必须使用别名,而不能用原表名,否则就会报无法绑定由多个部分组成的标识符错误。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aloneii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值