今天有个同事问我一个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"。

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

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

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

       一同事在测试服务器(系统:Windows 2008 R2 Standard 数据库:SQL SERVER 2008 R2)通过链接服务器test使用分布式事务测试时出错,出错信息如下: set ...

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

    公司一台老旧的SQL SERVER 2000 数据库,一周内会出现若干次(一次或多次)CPU 持续100%,导致应用程序没有反应的情况,如下图所示: 错误信息如下所示: 日期 2013/7/12 2: ...

  3. 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 Windows event logs for information about possible related problems

          早晨宁波那边的IT人员打电话告知数据库无法访问了.其实我在早晨也发现Ignite监控下的宁波的数据库服务器出现了异常,但是当时正在检查查看其它服务器发过来的各类邮件,还没等到我去确认具体情 ...

  4. [MS SQL Server]SQL Server如何开启远程访问

    在日常工作中,经常需要连接到远程的MS SQL Server数据库中.当然也经常会出现下面的连接错误. 解决方法: 1. 设置数据库允许远程连接,数据库实例名-->右键--->属性---C ...

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

    前言碎语 关于对SQL SERVER 日志文件管理方面了解不多的话,可以参考我的这篇博客文章“MS SQL 日志记录管理”,不过这篇文章只是介绍对SQL SERVER日志记录的深入认知了解,并没有提出 ...

  6. 数据库优化实践【MS SQL优化开篇】

    数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应用程序,对数据的CRUD操作进行统一管理和控 ...

  7. MS SQL还原备份数据出错

    MS SQL还原 XXXX.bak文件时候,数据库中出现如下的错误. 错误提示: 还原 对于 服务器“SAM-PC\SQLEXPRESS”失败.  (Microsoft.SqlServer.SmoEx ...

  8. MS SQL 多连接数时修改数据库名称

    在MS SQL中,如果你想修改某一个数据库的名称,你可以通过下面几种方法实现. 方法一:使用SP_RENAMEDB系统存储过程实现. 语法: sp_renamedb [ @dbname = ] 'ol ...

  9. [转]ms sql 2000 下批量 附加/分离 数据库(sql语句)

    这次公司要把MS SQL Server 2000 服务器上的数据库复制到新的服务器上面去,于是几百个数据库文件就交给我附加到新服务器上了   以前一直没接触过这方面的东西,于是果断谷歌了也百度了  找 ...

随机推荐

  1. 当Azure里的虚拟机网卡被禁用了之后……

    这样的想法来自于一个假设,如果网卡被禁用之后,用户该如何处理,Azure又该如何处理,对于设置在虚拟机中的禁用网卡选项是否还有存在的意义?通常情况下,点选了禁用网卡对于你和虚拟机来说就一下之抓瞎了,瞬 ...

  2. Linux中读写权限

    learn the auth of Linux.   Generally, r-x w: write , modify and delete  -2 r: read   -4 x: execute   ...

  3. jQuery插件之ajaxFileUpload异步上传

    介绍 AjaxFileUpload.js 是一个异步上传文件的jQuery插件,原理是创建隐藏的表单和iframe然后用JS去提交,获得返回值. 下载地址: http://files.cnblogs. ...

  4. 使用 PowerShell 自动化 CloudServices 发布

    在软件的开发过程中,自动化的编译和部署能够带来很多的优势.如果可以通过一个脚本实现软件的自动化部署,那么就可以节省大量的时间去做其它事情. 下面介绍如何将云应用程序通过 PowerShell 自动发布 ...

  5. UDS(ISO14229-2006) 汉译(No.6 应用层服务)

    6.1总览 应用层服务通常被当作诊断服务.应用层服务用于在基于客户端-服务器的系统(Client-Server base System)中执行一些功能,例如针对车载服务器(ECU)的检测.检查.监控和 ...

  6. Java--Callable与返回值future

    package com; import java.util.concurrent.*; /** * Created by yangyu on 16/11/28. */ /** * Callable a ...

  7. 高性能 Socket 组件 HP-Socket v3.1.3 正式发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件,提供服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP/ ...

  8. Https网站搭建——通过https://localhost:8443访问tomcat首页

    图片大致介绍了Https浏览器与服务器握手的过程,涉及到的名词:证书.Hash算法.随机数密码.公钥加密.私钥解密.握手消息.hash验证.摘要 tomcat服务器配置可以实现https双向认证,简单 ...

  9. Struts,spring,hibernate三大框架的面试

    Struts,spring,hibernate三大框架的面试 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3 ...

  10. 使用C#开发数据库应用系统

    第一章 初识Windows程序 01.浅谈控制台应用 解析:控制台应用程序:dos窗口中显示 Windows窗体应用程序:有控件参与的,支持事件的一种程序 02.关于窗体项目的注意点: /*01.一个 ...