仓酷云

标题: MSSQL网页设计[SQL]不要让SQLServer帮你主动转换SQL命... [打印本页]

作者: 再见西城    时间: 2015-1-16 22:28
标题: MSSQL网页设计[SQL]不要让SQLServer帮你主动转换SQL命...
线上或者测试环境经常出现的误操作总是让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命令。
作者: 再见西城    时间: 2015-1-19 14:30
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
作者: 分手快乐    时间: 2015-1-26 23:01
学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了!
作者: 老尸    时间: 2015-2-4 23:14
比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。
作者: 若相依    时间: 2015-2-10 22:50
也可谈一下你是怎么优化存储过程的?
作者: 莫相离    时间: 2015-3-1 17:04
如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。
作者: 深爱那片海    时间: 2015-3-10 21:23
一个是把SQL语句写到客户端,可以使用DataSet进行加工;
作者: 小妖女    时间: 2015-3-17 10:47
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
作者: 若天明    时间: 2015-3-24 07:46
XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2