问题将列值从VARCHAR(n)转换为DECIMAL

时间:2010-04-06 23:44:51

标签: sql-server tsql sql-server-2000 data-conversion

我有一个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;

我尝试转换为其他数据类型,例如FLOAT和MONEY,但只有MONEY成功。所以我尝试了以下内容:

SELECT CAST(CAST([MyColumn] AS MONEY) AS DECIMAL)
FROM [MyTable];

......工作得很好。原始查询失败的任何想法?如果我先转换为MONEY然后转换为DECIMAL会出现问题吗?

谢谢!

3 个答案:

答案 0 :(得分:17)

这可能取决于十进制符号是逗号还是点。以下是一些测试查询及其结果:

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的文档说:

  输入时,

ISNUMERIC返回1   表达式求值为有效   整数,浮点数,钱   或十进制类型;否则它会返回   0

3.63,6都可以投放到money,这就是isnumeric('3,6')返回1的原因。

要解决此问题,请使用点替换逗号(反之亦然,如果系统使用逗号作为小数符号):

select cast(replace('3,6',',','.') as decimal)

另一种选择是在Windows中更改“十进制符号”。它在Config Panel中 - >区域和语言 - >格式 - >其他设置 - >号。

答案 1 :(得分:3)

另一个原因是空字符串。例如,如果使用导入向导导入CSV文件,则空字段将变为空字符串,而不是空字符。

这是解决这个问题的常用习惯用语:

CAST(NULLIF([number_as_a_string],'') AS decimal(13,2))

答案 2 :(得分:0)

选择CAST(isnull(MyColumn,0)为十进制(4,2)) 来自[MyTable];

相关问题