【问题标题】:Problem convert column values from VARCHAR(n) to DECIMAL将列值从 VARCHAR(n) 转换为 DECIMAL 的问题
【发布时间】:2010-04-06 23:44:51
【问题描述】:

我有一个 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 会有问题吗?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 是一些带有逗号而不是小数点的记录导致了问题。感谢您的精彩回答!
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      选择 CAST(isnull(MyColumn,0) as Decimal(4,2)) 从[我的表];

      【讨论】:

        猜你喜欢
        • 2014-04-12
        • 2019-01-22
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-14
        • 1970-01-01
        • 2016-03-18
        相关资源
        最近更新 更多