SQLServer转换SQL中的数据(将数据类型 varchar 转换为 numeric 时出错)

有一天,执行

SELECT * FROM XXX_ORIGINAL_20031205
where msgid=62010388000012

语句,结果SQL Server报告出错:将数据类型 varchar 转换为 numeric 时出错。

 

这是什么意思呢?

Msgid这个字段的类型是:varchar(30)

 

环境:

数据库服务器:Microsoft SQL Server 2000以及7.0

数据库服务器补丁:Microsoft SQL Server 2000 ServicePack1

 

原因分析:

不是SQL Server突然不能从数字自动转换为字符串,而是单单对这个字段的数值有问题,这也和这个字段中实际已存储的字符串有关。

 

你看,我执行这个SQL语句是没有问题,可以自动转换:

SELECT * FROM XXXX_ORIGINAL_20031205
where recordid=62010388000012

recordid这个字段的类型也是:varchar(30)

这为什么就可以呢?

 

为什么?

这是因为msgid字段的真实数值是类似于这样的字符串“12051113280101053509”,由于你的SQL命令中要求拿字符串跟我们提供的这个数字62010388000012匹配,所以SQLServer默认要把这么多个“12051113280101053509”先统统转换为数字,再去跟62010388000012匹配。

(首先这就涉及到一个效率问题,转换这么多msgid成为数字,再跟你的数字匹配,将是一个多么大的浪费啊)

当然,这回SQLServer转不过来了,因为“12051113280101053509”换为数字实在太大了,超出了范围,所以你看SQLServer于是乎报告将数据类型 varchar 转换为 numeric 时出错,他指的就是把历史数据“12051113280101053509”这个varchar(30)转成numeric不行,而不是把你SQL脚本传递的参数62010388000012转换失败。

 

让我们看看另一种形式的错误,就更清楚了:

我们执行

SELECT * FROM XXXX_ORIGINAL_20031205
where msgid=120

命令就会得到错误:

varchar '12050003010101026986' 的转换溢出了 int 列。超出了最大整数值。

 

这个错误,是不是很清楚地表明了SQLServer在帮你执行SQL命令时背后所作的事情?

他试图帮你主动把记录中的这个字段转换成你在SQL命令中指明的那个数据类型。

 

我的建议:

很多时候,我们懒得去看某个字段到底是什么类型,是char,还是tinyint,还是bool,还是varchar,我们就随便写一个数字,让聪明的SQL Server自己去判断该转成什么。

但是,第一,SQL Server不是转换你的脚本命令中的数值,而是转换已有的历史数据到你指定的那个类型,所以会增加执行时间;第二,容易转换出错。

所以,切忌让SQLServer自己判断,自动帮你转换,那样将降低执行效率,而且增加出错几率。你能够显式告诉SQL Server你的数据类型的话,就请一定这么做。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值