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"。

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

时间: 2024-11-02 07:30:05

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

sql语句-sql 2008 无法绑定由多个部分组成的标识符

问题描述 sql 2008 无法绑定由多个部分组成的标识符 SQL 语句: insert into dbo.T117_F33 (ID,F1,F2,F3,F4) select xmspmx.ID,xmspmx.F1,xmspmx.F2,xmspmx.F3,xmspmx.F4 from dbo.T111_F34 as xmspmx where T117_F33.T117_ID = xmspmx.T111_ID 报错: 消息 4104,级别 16,状态 1,第 1 行 无法绑定由多个部分组成的标识符

MS SQL 错误:The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "test" was unable to begin a distributed transact

   一同事在测试服务器(系统:Windows 2008 R2 Standard 数据库:SQL SERVER 2008 R2)通过链接服务器test使用分布式事务测试时出错,出错信息如下: set xact_abort on begin tran update test.mydb.dbo.test_one set name='test' where  id= 3 ; commit OLE DB provider "SQLNCLI10" for linked server "

MS SQL 错误 :17883,严重度: 1,状态: 0

 公司一台老旧的SQL SERVER 2000 数据库,一周内会出现若干次(一次或多次)CPU 持续100%,导致应用程序没有反应的情况,如下图所示: 错误信息如下所示: View Code  数据库版本.补丁情况如下: Code Snippet SELECT SERVERPROPERTY('productversion')   AS ProductVersion ,              SERVERPROPERTY('productlevel')  AS ProductLevel  ,

MS SQL错误:SQL Server failed with error code 0xc0000000 to spawn a thread to process a new login or connection. Check the SQL Server error log and the W

      早晨宁波那边的IT人员打电话告知数据库无法访问了.其实我在早晨也发现Ignite监控下的宁波的数据库服务器出现了异常,但是当时正在检查查看其它服务器发过来的各类邮件,还没等到我去确认具体情况,就收到了电话.我首先检查网络是否畅通,结果发现网络没有问题,然后远程登录到该服务器,查看了一下数据库的服务发现其运行正常,但是在本机使用MSSMS管理工具亦无法连接数据库,当下有两种方案:方案一:使用DAC登录数据库,检查具体情况,方案二:直接去查看错误日志,查看具体错误信息.于是为了快点找到原

MS SQL Server数据库清理错误日志的方法

SQL错误日志记录了数据库运行过程的遇到的各种问题及一些重要信息,作为排错需要,我们通常都不会主动去清理这些日志文件,只有每次重启服务器时,SQL会自动删除时间最老的日志文件,并新生成一个日志文件. 通过在服务器上查看数据库的日志文件,发现存在大量的query notification dialog的信息,而且出现的频率非常的高,导致日志文件增大非常快. 通过google了解到这个错误跟service broker的消息机制由关系,可以通过使用跟踪标记:DBCC TraceOn(4133,-1)

MS SQL 需要定期清理日志文件

前言碎语     关于对SQL SERVER 日志文件管理方面了解不多的话,可以参考我的这篇博客文章"MS SQL 日志记录管理", 不过这篇文章只是介绍对SQL SERVER日志记录的深入认知了解,并没有提出如何管理日志文件的方案,如果你有兴趣的话,倒不妨可以钻研一下如何管理.提取日志记录信息,这是数据库 精细化管理的一个方面,如果手头管理的服务器过多,事情过多,你很难做到精细化管理!很多事情都忙不过来,需要时间去做!   问题现象     这几天有台数据库服务器一天会收到8封左右的

使用publishing转移MS SQL数据

最近,将网站从国内网站搬移到了Lunarpage,程序转移比较简单,使用cuteftp上传上去就可以了.但是数据库转移一直都是很棘手的一个问题.本文介绍数据库转移的方法. 数据库转移最简单的方法是使用DTS,但是Lunarpages数据库不支持远程数据库链接,所以无法使用DTS,因此只好使用publishing转移数据. 具体步骤如下: Step1. 运行 SqlPubWiz.exe Publishing类似MS SQL的一个插件,你可以到 http://www.microsoft.com/do

MS SQL Server 2000数据转换服务部署

server|数据|转换 1. 目标 MS SQL Server做大数据量传输的时候,我们大多会用到数据传输服务.现在假设,在开发环境下,我们已经设计好了DTS包并且运行良好,接下来我们要做的事情是迁移和部署这个DTS数据包.所以,我们需要把设计环境下的DTS包保存成结构化的存储文件,并且这个文件导入到目标环境下的MS SQL Server中,最后添加作业,让MS SQL Server Angent在我们预期的事情执行这个DTS包完成数据传输工作.其中需要重点解决的一个问题是,在目标环境中,DT

MS SQL Server2k数据转换服务部署

1. 目标 www.yestar2000iTbulo.comWp3XQ MS SQL Server做大数据量传输的时候,我们大多会用到数据传输服务.现在假设,在开发环境下,我们已经设计好了DTS包并且运行良好,接下来我们要做的事情是迁移和部署这个DTS数据包.www.yestar2000iTbulo.comWp3XQ 所以,我们需要把设计环境下的DTS包保存成结构化的存储文件,并且这个文件导入到目标环境下的MS SQL Server中,最后添加作业,让MS SQL Server Angent在我