3

我有一个带有 VARCHAR(255) 类型列的 SQL Server 2000 数据库。所有数据要么是 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 会有问题吗?

谢谢!

4

3 回答 3

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 中的“十进制符号”。它位于配置面板 -> 区域和语言 -> 格式 -> 附加设置 -> 数字中。

于 2010-04-07T00:01:00.097 回答
3

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

这是解决此问题的常见习语:

CAST(NULLIF([number_as_a_string],'') AS decimal(13,2))
于 2013-07-11T21:43:30.010 回答
0

选择 CAST(isnull(MyColumn,0) as Decimal(4,2)) FROM [MyTable];

于 2010-04-07T09:40:08.783 回答