MS SQL 错误:无法绑定由多个部分组成的标识符 "xxxxx"-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

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

简介:

    今天有个同事问我一个SQL问题,觉得有点意思,虽然能很快定位并解决问题,但是就是有种说不清道不明的感觉。因为不能解释清楚(很多是建立在假设上),顺便记录一下,希望有清楚原理的人能解答一二。

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章
最新文章
相关文章