详细分析sqlserver中的小数类型(float和decimal)_MsSql

来源:脚本之家  责任编辑:小易  

RTRIM去掉字2113符串的右空格,LTRIM去掉字符串的5261左空格,Upper把字符串转为大写。这一句SQL的意4102思是从比较Prompt_DaysumTime和sys_var_id的值,把值相等1653的数据SELECT出来,比较不区分大小写,不考虑左右空格 前面的有一个错误WHERE sys_var_id ='Prompt_DaysumTime' yes是'xxxx_xxx'ok是一个值条件是选中 sys_var_id列中值是 'Prompt_DaysumTime' 的记录,中的SELECT sys_var_value 列的值这才是正解ok,RTRIM去掉字符串的右空2113格,LTRIM去掉字符5261串的左空格,Upper把字符串转为4102大写。这一句SQL的意思是1653从比较Prompt_DaysumTime和sys_var_id的值,把值相等的数据SELECT出来,比较不区分大小写,不考虑左右空格本回答被网友采纳,Upper 将字符变量转换成大写。LTRIM 删除字符变量的起始空格。RTRIM 删除字符变量的尾随空格,从t_sys_system 表查询sys_var_value 列 ,条件是2113 sys_var_id 和 Prompt_DaysumTime 这两5261列数据各自去掉前后空格,并4102把小写转换为大写1653字符之后,两列数据相等。不过话说sql server 默认值是不区分大小写的,比如 'a' = 'A' 这个等式是成立的,前面的肯定很简单了,后面的自己查一下Upper TRIM 和LTRIM 以及 RTRIM函数,自己就懂了,意思是取出2113sys_var_value的值满足在表t_sys_system中5261sys_var_id = prompt_dayssumtime 的记录, 其中upper是把字符串转成大写4102, ltrim 和 rtrim是左右去1653掉空格,就是2113从t_sys_system表中选取出所有符合,将5261sys_var_id字段内数据数值左右4102的空格去除并且全部转换1653为大写字母,如果与'Prompt_DaysumTime'左右的空格去除并且全部转换为大写字母相等的数据的sys_var_value列的值www.zgxue.com防采集请勿采集本网。

在SQL Server中实际上只有两种小数数值类型,分别是float(近似数值)和decimal(精确数值),这两种类型能表示所有的小数数值类型。

这样就可以: 1、写好要运行的sql,点击运行按钮: 2、然后结果就可以在下方显示,图中标红部分就是结果区:

float(近似数值类型)

如何在sql server中查询分析 你已经升级成功了啊,第一行信息就是你所谓的“查询分析器”的 第二个是分析服务的,可能是你升级的时候没有勾选完全吧 再者,你打开这个的时候,图标不都显示08R2的

float表示的是近似数值,存在一定的精度缺失。

首先你要保证你要执行查询的对象(表或者视图)存在,是当前用户下的还是其他用户的表,如果是其他用户的表要使用 用户名.表名 的方式来访问。distinct的意思是如果出现重复记录,只显示一条。

float(n)

Microsoft将SQL Server移植到Windows NT系统上专注于开发推广SQL Server的Windows NT版本,Sybase则较专注于SQL Server在UNIX操作系统上的应用.Microsoft SQL Server以后简称为SQL Server或MS SQL Server

这里的n是以科学计数法存储浮点数尾数的位数,因此此参数决定了精度和存储的大小。其是可选的,默认值是53,即float等价于float(53),占用8bytes。如果指定了n,则它必须是介于1至53之间的值。实际上,虽然n的取值范围定义是1至53,但实际上float只能表示float(53)和float(24)两种类型,分别占用8bytes和4bytes。

n的范围 精度 存储大小
1-24(都视为24) 7位小数 4bytes
25-53(都视为53) 15位小数 8bytes 

SQL Server 2000常用命令,语法使用方法: (1)数据记录筛选: sql=\"select*from 数据表 where 字段名=字段值 order by 字段名[desc] sql=\"select*from 数据表 where 字段名 like '%字段值%' order

使用近似数值要格外注意尽量避免相等比较,因为比如1可以被存储为1.000000056,也可以被存储为1.00000000672,进行相等比较会得到意料之外的结果。

decimal(精确数值类型)

decimal表示的是精确数值类型。不存在精度损失,别名是numeric。

decimal(p, s)

-- 等价于

numeric(p, s)

精确数值类型需要分别指定小数的最大位数(p)和小数位的数量(s): p(precision):指定小数的最大位数,小数点的左侧和右侧的数字的总数量不能超过p,p的取值范围是从1到38,默认值为18。 s(scale):指定在小数点右侧的小数位数,p-s是小数点左边的最大位数。s必须是从0到p的值,只有在指定了精度的情况下才能指定s,s的默认值是0,因此,0 <= s <= p。

p的大小也同时决定了存储位数的大小:

精度大小 存储位数
1-9 5
10-19 9
20-28 13
29-38 17

因为p和s必须遵守规则:0 <= s <= p <= 38,所以decimal(p, s)实际上能够表示的有效值是从-10^38+1到10^38-1。这就意味着,decimal数据类型的最大精度是38,即最多可以存储38位数字,所有这些数字均可位于小数点后面。decimal数据类型存储精确的数字表示形式,没有近似值。

小数的除法

小数的除法实际上是近似运算,因此在使用除法的时候SQL Server会自动将小数的类型提升为float类型(隐式数据类型升级)。

小数常量的默认数据类型是decimal,但是float类型的优先级比decimal类型要高。在默认的情况下,SQL Server会将小数数值的常量自动转换为decimal数据类型(常态下),而在进行小数的除法运算的时候,则会就近进行数据类型的升级,转换为float(24)或float(53)数据类型(运算时)。

简单举个例子,常量12.345在常态下会被解析并转换为numeric(5, 3)的数值类型,即使用最小精度5和最小小数位数3;而在运算除法时,比如12.345/2则会被解析并转换为float(24),即最小精度的近似数值类型。

小数转为字符串

相比cast(float_expression as float(24/53)),使用str()函数更能够有效控制近似数值的小数位数,因为str()函数获取的是近似数值。

str(float_expression [ , length [ , decimal ] ])

str()函数可以接受length、decimal两个参数,皆是可选的。 length是小数的总位数,包含正负符号,小数点,小数点左边和右边数字个数之和; decimal是小数位的数量(小数点右边数字个数),小数位最大为16位,不能超过16,否则,会被截断为16位。如果小数位没有decimal多,那么右边补0。 返回值是varchar类型。

将decimal常量转换为varchar类型:

select str(123.45, 10, 2); -- 123.45

将float表达式的值转换为varchar类型(位数不足自动补0):

select str(1.0/3, 10, 8); -- 0.33333300

对小数常量转换为varchar类型,减少小数位的数量,由2位减少为1位(会自动进行四舍五入运算):

select str(123.45, 6, 1); -- 123.5

使用函数str或cast将float和decimal强制转换为varchar类型时,返回的数值可能是不相同的:

select str(56.64564684439527, 38, 20); -- 56.64564684438742000000select cast(56.64564684439527 as varchar(100)); -- 56.64564684439527

这是因为两种函数的处理方式的不同导致的:str()函数会对小数数值先取近似值;而cast()函数则是返回与原始值数据类型相同的值(decimal返回精确值,float返回近似值)。

以上就是详细分析sqlserver中的小数类型(float和decimal)的详细内容,更多关于sqlserver 小数类型的资料请关注真格学网其它相关文章!

首先我们来看一个简单的例子,大结构非常简单:1,process-list显示了两个进程之间发生了死锁process60fb88和processd11902c8。2,vistim-list显示了process60fb88被选为了牺牲者。2,后面的resource-list显示了两个进程争取并导致死锁的资源。[html]view plain copy(7506ff9b7b0d)"waittime="4376"ownerId="2656658629"transactionname="SELECT"lasttranstarted="2014-04-09T23:01:35.743"XDES="0x80059940"lockMode="S"schedulerid="4"kpid="10640"status="suspended"spid="80"sbid="0"ecid="0"priority="0"trancount="0"lastbatchstarted="2014-04-09T23:01:35.657"lastbatchcompleted="2014-04-09T23:01:35.657"clientapp=".Net SqlClient Data Provider" hostname="BODCPRODVSQL128" hostpid="10088" loginname="PROD\\s-propdata" isolationlevel="read committed (2)"xactid="2656658629"currentdb="9"lockTimeout="4294967295"clientoption1="671088672"clientoption2="128056">DECLARE@logText NVARCHAR(MAX)EXEC IntegratedService_ProcessLatestCommand@logText OUTPUTSELECT@logText(ed2e944beff9)"waittime="4379"ownerId="2656658630"transactionname="UPDATE"lasttranstarted="2014-04-09T23:01:35.743"XDES="0x80048570"lockMode="X"schedulerid="8"kpid="6620"status="suspended"spid="53"sbid="0"ecid="0"priority="0"trancount="2"lastbatchstarted="2014-04-09T23:01:34.650"lastbatchcompleted="2014-04-09T23:01:34.650"clientapp=".Net SqlClient Data Provider" hostname="BODCPRODVSQL128" hostpid="10088" loginname="PROD\\s-propdata" isolationlevel="read committed (2)"xactid="2656658630"currentdb="9"lockTimeout="4294967295"clientoption1="671088672"clientoption2="128056">DECLARE@logText NVARCHAR(MAX)EXEC IntegratedService_ProcessLatestCommand@logText OUTPUTSELECT@logText下面是详细分析。1,victim-list没什么可分析的。2,process-list中关于各个process的详细信息很重要。waitresource="KEY:9:72057597664231424(7506ff9b7b0d)当前process正在等待的资源。通常我们在resource-list中可以看到同样的信息。使用下面的sql查询等待的资源是什么:下面使用的hobtid是heap or b-tree id的缩写。详细见sys.partotions的解释。[sql]view plain copySELECT o.name,i.nameFROM sys.partitions pJOIN sys.objects o ON p.object_id=o.object_idJOIN sys.indexes i ON p.object_id=i.object_idAND p.index_id=i.index_idWHERE p.hobt_id=72057597664231name nameMatchService PK_Matcher_ID从结果我们就可以知道,等待的资源是一个表MatchService的主键PK_Matcher_ID。考察另外一个process的waitresource我们可以得知等待的资源是同一个表的另外一个索引。至此我们找到了直接导致死锁的资源是什么。同时可以看到两个process一个是x lock,一个是s lock。因此可以判定发生在该表上的一个修改语句和一个查询语句之间发生了死锁。另外,上例中可以清晰的看到是keylock导致的死锁,因此查询partitions可以找到对应的object(sys.partitions contains a row for each partition of allthe tables and most types of indexes in the database.)。但有时是其他类型的资源发生了死锁,例如pagelock,waitresource="PAGE:9:1:28440841。9是dbid;1是fileid;28440841是pageid。对于这种情况,使用下面的语句查询对应的资源:[sql]view plain copyDBCC TRACEON(3604)GODBCC PAGE(9,1,28440841)GODBCC TRACEOFF(3604)GO从返回的Metadata:objectId找到对应的objectid。3,再看process中的inputbuf。这个tag表明了process正在运行的语句,因此对于定位死锁非常重要。但这里有一个问题,比如上例中,inputbuf是一个存储过程,其中又嵌套了很多其他的存储过程,但inputbuf是用户直接发出的sql,而我们需要在其中找出直接导致死锁的语句并优化,从而解决或减少死锁。自此我们已经有的信息是:导致死锁的语句由inputbuf中的语句调用,同时导致死锁的语句必定是对表MatchService的修改语句。如果存储过程很简单,到此DBA已经能够找到直接导致死锁的sql了,分析过程到此结束。而如果存储过程很复杂,则需要进一步分析。4,现在再进一步考察tag,executionStack。executionStack表明了死锁发生时,由inputbuf调用的一系列sql。上例中有4条sql。同时仔细观察上例可以发生,两个process的executionStack是完全相同的,因此考察一个就可以了。另外,如果procname不为空则直接得到了sql,但上例中该tag为空。自此我们希望把executionStack中的所有sql显示出来。使用下面的sql找出sqlhandle对应的在内存中的sql。需要注意的是,如果deadlock已经过去了一段时间,sqlhandle可能已经被从内存中清除掉了,这时就不可查了。还有sqlhandle是varbinaryd,所以查询时不可加引号。另外还有一个有趣的地方:和其他程序语言报错时一样,stack最上的一条是最直接的错误,后面的错误都是该错误的上一层错误(这么解释可能有点乱,写过代码的同学能理解哈)。因此在上面说的存储过程调用存储过程的情况中,executionStack中第一条是直接导致死锁的sql,第二条是调用该sql的sql,以此类推,最后一条理论上就是inputbuf中的sql。[sql]view plain copySELECT sql_handle AS Handle,SUBSTRING(st.text,(qs.statement_start_offset/2)+1,((CASE qs.statement_end_offsetWHEN-1 THEN DATALENGTH(st.text)ELSE qs.statement_end_offsetEND-qs.statement_start_offset)/2)+1)AS TextFROM sys.dm_exec_query_stats AS qsCROSS APPLY sys.dm_exec_sql_text(qs.sql_handle)AS stwhere sql_handle=0x030009003d00da3fa6087c0182a200000100000000000000order by sql_handle0x030009003D00DA3FA6087C0182A200000100000000000000SELECTTOP 1@matcherQueueID=lhs.MatcherService_MatcherQueue_ID,rootOperationUID=Root_Operation_UID FROMMatcherService_MatcherQueue lhs WHERE lhs.Processing_State'MATCHING' OR lhs.Processing_State='MATCHED' ORDER BYLast_Execution_Date ASC0x030009003D00DA3FA6087C0182A200000100000000000000SELECT Top 1@ticketID=OperationLog_ID FROM GEDemo.dbo.OperationLogWHERE@rootOperationUID=Root_Operation_UID AND Status=0ORDER BY OperationLog_ID ASC0x030009003D00DA3FA6087C0182A200000100000000000000UPDATE MatcherService_MatcherQueue SET Last_Execution_Date=GETDATE()WHERE MatcherService_MatcherQueue_ID=matcherQueueID注意看起来一个sql_handle有三条语句,原因是这三条sql是属于同一个存储过程的。如果一个sql_handle包含的语句很多,比如是一个很长的存储过程,那么我们还可以使用一个有力的信息:executionStack中的linetag.这条语句表明了到底是哪一个sql直接导致了死锁。如果一条statement中又包含了很多表,那么还需要和死锁的资源结合起来判断是哪个表或索引的数据发生了死锁内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 浅谈sqlserver下float的不确定性
  • sqlserver 表类型和表变量介绍
  • java sqlserver text 类型字段读取方法
  • sqlserver中将varchar类型转换为int型再进行排序的方法
  • sqlserver查询数据类型为ntext是空或null值的方法
  • sqlserver 中datetime 和 smalldatetime类型分析说明
  • sqlserver 增删改查一些不常用的小技巧
  • 把excel表格里的数据导入sql数据库的两种方法
  • sql server 查询处理中的各个阶段(sql执行顺序)示例
  • sql语句执行顺序详解
  • sql server 2012 数据库所有表里查找某字符串的方法
  • sqlserver中master数据库分析
  • sql 函数大全 比较常用的一些函数整理
  • 如何得到数据库中所有表名 表字段及字段中文描述
  • select * from sp_who的解决方案
  • sql多条件多字段排序(图文教程)
  • 如何分析SQLServer中的deadlocktrace
  • SQL server语句解析
  • SQL server中SQL分析函数问题。
  • SQL SERVER是什么?详细解释?
  • 如何将sql server中查询分析器中的结果显示出来?
  • 如何在sql server中查询分析
  • SQL server 数据库语句解析求助
  • SQL Server的优点是什么?
  • SQL server 2000命令
  • SQL SERVER中数据量非常大,如果优化,可以举出一些详细的例子~
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页浅谈sqlserver下float的不确定性sqlserver 表类型和表变量介绍java sqlserver text 类型字段读取方法sqlserver中将varchar类型转换为int型再进行排序的方法sqlserver查询数据类型为ntext是空或null值的方法sqlserver 中datetime 和 smalldatetime类型分析说明sqlserver 增删改查一些不常用的小技巧把excel表格里的数据导入sql数据库的两种方法sql server 查询处理中的各个阶段(sql执行顺序)示例sql语句执行顺序详解sql server 2012 数据库所有表里查找某字符串的方法sqlserver中master数据库分析sql 函数大全 比较常用的一些函数整理如何得到数据库中所有表名 表字段及字段中文描述select * from sp_who的解决方案sql多条件多字段排序(图文教程)sql server 2012 安装图解教程(附sql server数据库入门学习总结microsoft sql server 2012 数据sql重复记录查询的几种方法win7系统安装sqlserver2000的详细sqlserver中distinct的用法(不重sql server错误代码大全及解释(sql-order by 多字段排序(升序、sql将一个表中的数据插入到另一个用sql语句添加删除修改字段、一些sql server中的非聚集索引详细介sql中group分组获取top n方法实现可首选rsql server页类型汇总+疑问汇总sql server 服务器优化技巧浅谈和表值函数连接引发的性能问题分析详解db2 sqlstate 57016 sqlcode=-668 原用sql语句添加删除修改字段、一些表与字段sql获取第一条记录的方法(sqlserver、orasql server 随机数函数sql server bulk insert 只需要部分字段时
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved