问题将列值从varchar(n)转换为十进制
-
25-09-2019 - |
题
我有一个SQL Server 2000数据库,其中包含VARCHAR类型(255)的列。所有数据均为null,或最多两个精度(例如'11 .85')的数字数据。我尝试运行以下T-SQL查询,但收到了错误的“错误将数据类型VARCHAR转换为数字”的错误'
SELECT CAST([MyColumn] AS DECIMAL)
FROM [MyTable];
我尝试了一个更具体的演员,这也失败了。
SELECT CAST([MyColumn] AS DECIMAL(6,2))
FROM [MyTable];
我还尝试了以下内容,以查看任何数据是否是非数字,而返回的唯一值是null。
SELECT ISNUMERIC([MyColumn]), [MyColumn]
FROM [MyTable]
WHERE ISNUMERIC([MyColumn]) = 0;
我试图转换为其他数据类型,例如浮动和金钱,但只有钱才成功。所以我尝试了以下内容:
SELECT CAST(CAST([MyColumn] AS MONEY) AS DECIMAL)
FROM [MyTable];
...正常工作。有什么想法为什么原始查询失败了?如果我首先转换为金钱然后再到十进制,会有问题吗?
谢谢!
解决方案
这可能取决于小数符号是逗号还是点。以下是一些测试查询及其结果:
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返回1;否则返回0
两个都 3.6
和 3,6
可以铸造 money
, , 所以这就是为什么 isnumeric('3,6')
返回 1
.
要解决此问题,请用点替换逗号(反之亦然,如果您的系统使用逗号作为十进制符号):
select cast(replace('3,6',',','.') as decimal)
另一个选择是更改Windows中的“十进制符号”。它在配置面板中 - >区域和语言 - >格式 - >其他设置 - >数字。
其他提示
另一个原因是空字符串。例如,如果您使用导入向导导入CSV文件,则空字段将变成空字符串,而不是空字符串。
这是解决此问题的常见习语:
CAST(NULLIF([number_as_a_string],'') AS decimal(13,2))
从[mytable]中选择Cast(Mycolumn,0)为十进制(4,2));
不隶属于 StackOverflow