这可能取决于小数符号是逗号还是点。以下是一些测试查询及其结果:
select CAST('3.6' as decimal) -- 3.60
select CAST('3,6' as decimal) -- Error converting data type varchar to numeric.
select CAST('3.6' as money) -- 3.60
select CAST('3,6' as money) -- 36.00 (!)
select ISNUMERIC('3.6') -- 1
select ISNUMERIC('3,6') -- 1
的文档ISNUMERIC http://msdn.microsoft.com/en-us/library/aa933213(SQL.80).aspx says :
当输入时 ISNUMERIC 返回 1
表达式的计算结果为有效
整数、浮点数、金钱
或十进制类型;否则它返回
0
Both 3.6
and 3,6
可以投射到money
, 所以这就是为什么isnumeric('3,6')
回报1
.
要解决此问题,请将逗号替换为点(或者反之亦然,如果您的系统使用逗号作为小数点符号):
select cast(replace('3,6',',','.') as decimal)
另一种选择是更改 Windows 中的“十进制符号”。它位于配置面板 -> 区域和语言 -> 格式 -> 其他设置 -> 数字。