ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

sqlserver数据类型转换(将 nvarchar 转换为数据类型 numeric 时出现算术溢出错误)

2022-06-13 11:37:14  阅读:276  来源: 互联网

标签:类型转换 转换 mm 数据类型 dd sqlserver yy ss hh


一般情况下,sqlserver会自动完成数据转换。但这种转换有时候很容易出错,尤其是nvarchar转换为numeric时。如果能够明确数据类型,最好显式转换。
举个我遇到的例子,
SELECT * FROM ITEM_INFO_TEST WHERE OBJECT_NO=’2’ AND COL530<5000.00
//COL530在数据库中类型为nvarchar(30),实际查询的时候值为40000。执行这个语句时报错:将 nvarchar 转换为数据类型 numeric 时出现算术溢出错误。
因为col530需要与5000.00进行运算,它会隐式的把col530由nvarchar向numeric转换,转换方式由5000.00来决定,且转换的长度也由它决定。本例中因为40000与5000位数不一致,会导致算术溢出错误。如果将5000.00改为50000.00,则40000与50000长度一致,隐式转换不会出问题。
这样隐式转换还存在一个问题,如果COL530为NULL,则COL530<5000.00永不会成立。查询结果必定为空。

所以在能够明确所需类型的情况下,最好使用显式转换。显示转换的方法主要有cast和convert。
CAST() 函数语法如下:
CAST ( AS [ length ])
例如CAST(COL530 AS NUMERIC(18,2)

CONVERT() 函数语法如下:
CONVERT ([ length ], [, style])
例如convert(numeric(18,2),col530)

1.data_type必须是sqlserver的基本数据类型,用户自定义类型不能转换。
2.length用于指定数据的长度,缺省值为30。

所以上面的语句改为:SELECT * FROM ITEM_INFO_TEST WHERE OBJECT_NO=’2’ AND cast(isnull(COL530,’0.00’) as numeric(18,2))<5000.00

convert功能与cast很类似,但convert更多的用于日期类型的转换。
CONVERT(data_type(length),data_to_be_converted,style)
data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style 规定日期/时间的输出格式。
可以使用的 style 值:
|———————|:—————:
|Style ID ——|:Style 格式
100 或者 0 ——|: mon dd yyyy hh:miAM (或者 PM)
101 ——|: mm/dd/yy
102 ——|: yy.mm.dd
103 ——|: dd/mm/yy
104 ——|:dd.mm.yy
105 ——|:dd-mm-yy
106 ——|: dd mon yy
107 ——|: Mon dd, yy
108 ——|: hh:mm:ss
109 或者 9 ——|: mon dd yyyy hh:mi:ss:mmmAM(或者 PM)
110 ——|: mm-dd-yy
111 ——|: yy/mm/dd
112 ——|: yymmdd
113 或者 13 ——|: dd mon yyyy hh:mm:ss:mmm(24h)
114 ——|: hh:mi:ss:mmm(24h)
120 或者 20 ——|: yyyy-mm-dd hh:mi:ss(24h)
121 或者 21 ——|: yyyy-mm-dd hh:mi:ss.mmm(24h)
126 ——|: yyyy-mm-ddThh:mm:ss.mmm(没有空格)
130——|: dd mon yyyy hh:mi:ss:mmmAM
131 ——|: dd/mm/yy hh:mi:ss:mmmAM

例如:
CONVERT(VARCHAR(19),GETDATE())
CONVERT(VARCHAR(10),GETDATE(),110)
CONVERT(VARCHAR(11),GETDATE(),106)
CONVERT(VARCHAR(24),GETDATE(),113)
CONVERT(VARCHAR(30),GETDATE(),20)

结果为
Dec 29 2008 11:45 PM
12-29-2008
29 Dec 08
29 Dec 2008 16:25:46.635
2015-08-06 14:00:10
————————————————
版权声明:本文为CSDN博主「鲲鹏之上」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liu_shi_jun/article/details/47313417

标签:类型转换,转换,mm,数据类型,dd,sqlserver,yy,ss,hh
来源: https://www.cnblogs.com/zhaog100/p/16370233.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有