首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> XML教程
[SQL]不要让SQLServer帮你自动转换SQL命令中的数据类型-数据库专栏,SQL Server
作者:网友供稿 点击:16
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
为什么不要让sqlserver帮你自动转换sql命令中的数据类型
report date:   2003/12/5

prepared by:     郑昀

article last modified on 2004-2-16

the information in this article applies to:

ü         microsoft sql server 2000,7.0
问题陈述:
有一天,执行

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

 

 

writen by zhengyun.nojunk(at)tomosoft.dot.com
disclaimers:
本文档所包含的信息代表了在发布之日,zhengyun 对所讨论问题的当前看法,zhengyun 不保证所给信息在发布之日以后的准确性。

本文档仅供参考。对本文档中的信息,zhengyun 不做任何明示或默示的保证。

用户必须遵守所有适用的版权法。在不对版权法所规定的权利加以限制的情况下,如未得到 zhengyun和csdn.net明确的书面许可,不得出于任何目的、以任何形式或手段(电子的、机械的、影印、录制等等)复制、传播本文的任何部分,也不得将其存储或引入到检索系统中。

文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·使用c#如何读取xml文件-.NET教程,XML应用
·利用XMLHTTP无刷新添加数据之Post篇.-ASP教程,XML相关
·VB下如何编写CRC校验程序-.NET教程,VB.Net语言
·Java编程中更新XML文档的常用方法-JSP教程,Java与XML
·JavaScript中获得地址栏参数QueryString-JSP教程,Java技巧及代码
·ASP.NET 2.0中将 GridView 导出到 Excel 文件中-.NET教程,数据库应用
·在red hat linux 10下安装 eclipse 3-JSP教程,Java技巧及代码
·WinCE 5.0边做边学(3)-.NET教程,评论及其它
·用Fireworks制作Logo心得体会-网页设计,Fireworks
·Cookies,SSL,httpclient的多线程处理,HTTP方法-PHP教程,PHP应用
最新文章
·google adsense 2007巡讲大会郑州站总结_网赚技巧
·起点小说网推出小说内容联盟_网赚技巧
·oblog站长访谈系列②:vv博客林林_站长访谈
·学习dreamweaver8了解掌握css层叠样式表_dreamweaver教程
·搞行业网站必须走出去!_站长心得
·网页设计的艺术处理原则_站长心得
·建站常识:如何使用ftp连接虚拟主机?_站长心得
·google rank_google推广
·如何在搜寻结果名中名列前茅_google推广
·几个知名英文搜索引擎的优劣比较_seo网站优化
相关主题
  • [SQL]啊?!查询分析器的BUG?!-数据库专栏,SQL Server
  • [SQL]对于“无法用TCP/IP协议和远端SQL Server数据库连接”问题-数据库专栏,SQL Server
  • [SQL]数据库置疑的故事-数据库专栏,SQL Server
  • [SQL]启动SQLServer的死锁检查-数据库专栏,SQL Server
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭