|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
线上或者测试环境经常出现的误操作总是让DBA同学那么闹心。server|sqlserver|数据|数据范例|转换为何不要让SQLServer帮你主动转换SQL命令中的数据范例
ReportDate:2003/12/5
Preparedby:郑昀
Articlelastmodifiedon2004-2-16
Theinformationinthisarticleappliesto:
üMicrosoftSQLServer2000,7.0
成绩报告:
有一天,实行
SELECT*FROMXXX_ORIGINAL_20031205
wheremsgid=62010388000012
语句,了局SQLServer呈报堕落:“将数据范例varchar转换为numeric时堕落。”
这是甚么意义呢?
Msgid这个字段的范例是:varchar(30)。
情况:
数据库服务器:MicrosoftSQLServer2000和7.0;
数据库服务器补钉:MicrosoftSQLServer2000ServicePack1;
缘故原由剖析:
不是SQLServer俄然不克不及从数字主动转换为字符串,而是单单对这个字段的数值有成绩,这也和这个字段中实践已存储的字符串有关。
你看,我实行这个SQL语句是没有成绩,能够主动转换:
SELECT*FROMXXXX_ORIGINAL_20031205
whererecordid=62010388000012
recordid这个字段的范例也是:varchar(30)。
这为何就能够呢?
为何?
这是由于msgid字段的实在数值是相似于如许的字符串“12051113280101053509”,因为你的SQL命令中请求拿字符串跟我们供应的这个数字62010388000012婚配,以是SQLServer默许要把这么多个“12051113280101053509”先一切转换为数字,再往跟62010388000012婚配。
(起首这就触及到一个效力成绩,转换这么多msgid成为数字,再跟你的数字婚配,将是一个何等年夜的华侈啊)
固然,这回SQLServer转不外来了,由于“12051113280101053509”换为数字其实太年夜了,超越了局限,以是你看SQLServer因而乎呈报“将数据范例varchar转换为numeric时堕落”,他指的就是把汗青数据“12051113280101053509”这个varchar(30)转成numeric不可,而不是把你SQL剧本传送的参数62010388000012转换失利。
让我们看看另外一种情势的毛病,就更分明了:
我们实行
SELECT*FROMXXXX_ORIGINAL_20031205
wheremsgid=120
命令就会失掉毛病:
varchar值12050003010101026986的转换溢出了int列。超越了最年夜整数值。
这个毛病,是否是很分明地标明了SQLServer在帮你实行SQL命令时面前所作的事变?
他试图帮你自动把纪录中的这个字段转换成你在SQL命令中指明的谁人数据范例。
我的倡议:
良多时分,我们懒得往看某个字段究竟是甚么范例,是char,仍是tinyint,仍是bool,仍是varchar,我们就任意写一个数字,让伶俐的SQLServer本人往判别该转成甚么。
可是,第一,SQLServer不是转换你的剧本命令中的数值,而是转换已有的汗青数据到你指定的谁人范例,以是会增添实行工夫;第二,简单转换堕落。
以是,切忌让SQLServer本人判别,主动帮你转换,那样将下降实行效力,并且增添堕落概率。你可以显式告知SQLServer你的数据范例的话,就请必定这么做。
Writenbyzhengyun.NoJunk(at)tomosoft.dot.com
Disclaimers:
本文档所包括的信息代表了在公布之日,ZhengYun对所会商成绩确当前意见,Zhengyun不包管所给信息在公布之日今后的正确性。
本文档仅供参考。对本文档中的信息,Zhengyun不做任何昭示或默示的包管。
用户必需恪守一切合用的版权法。在不合错误版权法所划定的权力加以限定的情形下,如未失掉zhengyun和CSDN.Net明白的书面允许,不得出于任何目标、以任何情势或手腕(电子的、机器的、影印、录制等等)复制、传布本文的任何部分,也不得将其存储或引进到检索体系中。
“数据行级锁定”的意思是指在事务操作的执行过程中锁定正在被处理的个别记录,不让其他用户进行访问。这种锁定将影响到(但不限于)SELECT、LOCKINSHAREMODE、SELECT、FORUPDATE命令以及INSERT、UPDATE和DELETE命令。 |
|