我有一个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.63,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));

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top