转换SQL命令中的数据类型出现的错误

转换SQL命令中的数据类型出现的错误

转载

问题陈述:

执行

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你的数据类型的话,就请一定这么做。

时间: 2024-10-03 22:32:23

转换SQL命令中的数据类型出现的错误的相关文章

sql server 中xml 数据类型的insert、update、delete

近日对SQL操作XML作了如下整理: 1.插入 XML DECLARE @myDoc XMLSET @myDoc = '<Root> <ProductDescription ProductID="1" ProductName="Road Bike"> <Features> </Features> </ProductDescription> </Root>'/*将元素节点插入到文档中*/--在Fe

SQL Server中的数据类型

参考 SQL Server 2012编程入门经典(第4版) SQL Server 自带的数据类型 整型: 货币 近似小数 日期/时间 特殊数字 字符 Unicode 二进制 其他 原文地址:https://www.cnblogs.com/dddyyy/p/9350317.html

安装vsphere client时出现“错误2229 无法在SQL查询中加载表”等错误

解决办法:请按照以下步骤继续进行升级: 找到日志文件 %TEMP%vim-sso-msi.log 搜索上次安装期间作为缓存文件的 *.mst 文件.例如: c:\Windows \Installer\xxxxx.mst 找到该 *.mst 文件并将其删除. 重新安装vsphere client即可

【译文】怎样在R语言中使用SQL命令

[译文]怎样在R语言中使用SQL命令 作者 Fisseha Berhane 对于有SQL背景的R语言学习者而言.sqldf是一个很实用的包,由于它使我们能在R中使用SQL命令.仅仅要掌握了主要的SQL技术.我们就能利用它们在R中操作数据框.关于sqldf包的很多其它信息,能够參看cran. 在这篇文章中,我们将展示怎样在R中利用SQL命令来连接.检索.排序和筛选数据. 我们也将展示怎么利用R语言的函数来实现这些功能.近期我在处理一些FDA(译者注:食品及药物管理局)的不良事件数据.这些数据很混乱

SQL Server 2005 中的数据类型总结

注:转自土豆网 SQL Server 2005 中的数据类型归纳为下列类别: 精确数字 bigint decimal int numeric smallint money tinyint smallmoney bit 近似数字 float real 日期和时间 datetime smalldatetime 字符串 char text varchar Unicode字符串 nchar ntext nvarchar 二进制字符串 binary image varbinary 其他数据类型 curso

SQL Server中提前找到隐式转换提升性能的办法

    http://www.cnblogs.com/shanksgao/p/4254942.html 高兄这篇文章很好的谈论了由于数据隐式转换造成执行计划不准确,从而造成了死锁.那如果在事情出现之前发现了这类潜在的风险岂不是更好?     那么我们来看一个简单的例子,如代码清单1所示.   1: SELECT * 2: FROM HumanResources.Employee 3: WHERE NationalIDNumber = 243322160 4:  5: SELECT * 6: FR

转发:使用sql命令查询视图中所有引用的基础表

转自:使用sql命令查询视图中所有引用的基础表 使用sql命令查询视图中所有引用的基础表 之前有写过如何利用sql查询视图中所有引用的表发现这个方法并不能查出视图中所有的基础表,如果视图中有嵌套视图就会有问题,因为目录视图sys.sql_dependencies并不包含所有的引用实体.后面发现在sql2008及以后的版本中推出的sys.sql_expression_dependencies视图解决了这一问题,所以重新写了段sql,用来查询视图中所有引用的基础表,包括嵌套视图中的基础表.这个有什么

SQL Server中使用convert进行日期转换

SQL Server中使用convert进行日期转换 一般存入数据库中的时间格式为yyyy-mm-ddhh:mm:ss 如果要转换为yyyy-mm-dd  短日期格式.可以使用convert函数.下面是sqlserver帮助中关于convert函数的声明: 使用 CONVERT: CONVERT (data_type[(length)],expression[,style]) 参数 expression 是任何有效的 Microsoft® SQL Server™ 表达式.data_type 目标

Sql Server中的数据类型和Mysql中的数据类型的对应关系(转)

Sql Server中的数据类型和Mysql中的数据类型的对应关系(转):https://blog.csdn.net/lilong329329/article/details/78899477 一.SQL SERVER与MySQL数据存储的差异 1.SQL SERVER中的datetime,保留到微秒(秒后小数点3位),而mysql仅保留到秒,转换后是否会影响业务,如果影响,需要新增一个字段专门来存储微秒或者毫秒,虽然mysql中没有时间数据类型的精度到达微秒或者毫秒,但是mysql提供对微秒的