一般情况下,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