比如某个MEMBER表有字段Mobile,类型Char(11),一般情况下,如果数据正常,即所有MEMBER记录都存在MOBILE且MOBILE字段值均为数字,则以下SQL语句正常:
AND Mobile= 13698756256
假如存在MEMBER表存在Mobile值为非数字字符串或者NULL时,
AND Mobile= 13698756256 检索即报错“从数据类型 varchar 转换为 numeric 时出错”这里我理解为:SQLSERVER数据库内部检索时,因为13698756256是数字,则会先把Mobile转换成Number,然后转换后的和13698756256进行匹配判断;
于是,当Mobile值为非数字字符串或者NUll时,转换即报错“从数据类型 varchar 转换为 numeric 时出错”接着测试
1.and MobileNo = 18999999999 and STATUS = 2 报错“从数据类型 varchar 转换为 numeric 时出错”
2.and MobileNo = 18999999999 and ID=5 检索正常无数据
已知STATUS = 2 有大量数据, ID=5 存在数据
继续测试发现:
当第二个条件可以限定为一条数据时,检索正常无数据
当第二个条件不能限定为一条数据时,这时候SQL数据库还需要根据第一条件去限定,同前面理,报“从数据类型 varchar 转换为 numeric 时出错”已下为只是黑盒测试来推荐,尚未考究SQLSERVER2005的内部运行机制如果测试或者分析存在不合理的情况,请高手指点,大家也可以相互探讨

解决方案 »

  1.   

    等号两边那个数据类型优先级高就往那边转换
    Mobile= 13698756256
    会把你的varchar 列转换为int 在和13698756256比较
    就这样了等号两边的数据类型不一致会导致效率降低或出错
      

  2.   

    SQLServer的确会隐式转换类型,如果你的
    1.and MobileNo = 18999999999 and STATUS = 2 报错“从数据类型 varchar 转换为 numeric 时出错”
     2.and MobileNo = 18999999999 and ID=5 检索正常无数据
    那尝试先查一下是哪个字段导致没数据或者报错
      

  3.   


    额,我帖子中已经说的很明确了吧。
    是MobileNo字段存在不正常数据引起的
      

  4.   

    首先 你的 字段Mobile,类型Char(11),
    AND Mobile= 13698756256  这样写明显是错误  AND Mobile= "13698756256"
    加个双引号才对
      

  5.   


    这个显而易见的。我的意思是来探究下 SQLSERVER内部到底是怎么个运行机制