我有一个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会出现问题吗?
谢谢!
答案 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.6
和3,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];