【问题标题】:Error converting data type varchar to decimal, --data type errors将数据类型 varchar 转换为十进制时出错,--数据类型错误
【发布时间】:2015-05-11 07:18:16
【问题描述】:

我正在更改视图以将地理坐标(具有不同十进制精度的数字)转换为十进制字段。

我已确认源表中的唯一项目是数字和小数 - 但我收到了错误

“将数据类型 varchar 转换为数值时出错。”

源表中的小数是否可能被读取为字符,如果是,我该怎么做才能成功执行此转换?

ALTER VIEW [SCHEMA].[VIEW_V]
AS SELECT   
        cast(field 1 AS decimal (26,19)) as x_coord         
   FROM   [linkedServer].[Sourcedatabase].[schema].[dt_table]

【问题讨论】:

  • 你可能认为所有的值都是数字,但 SQL Server 更清楚。您可能会遇到各种问题,很可能是字段中的非数字字符。您可能在两台机器上有不同的国际化设置,因此逗号或句点会被拒绝。我认为这是一个数据问题,而不是 SQL 问题。

标签: sql casting type-conversion ssms-2012


【解决方案1】:

尝试使用isnumeric()try_convert()

ALTER VIEW [SCHEMA].[VIEW_V] AS
    SELECT (CASE WHEN isnumeric(field1) = 1 
                 THEN cast(field1 AS decimal(26,19)) 
            END)as x_coord
    FROM   [linkedServer].[Sourcedatabase].[schema].[dt_table];

ALTER VIEW [SCHEMA].[VIEW_V] AS
    SELECT try_convert(decimal(26, 19), field1) 
    FROM   [linkedServer].[Sourcedatabase].[schema].[dt_table];

如果结果值为NULL,您将知道哪些行导致了问题。

【讨论】:

    【解决方案2】:

    如果浮点值带有字符 'e' '+',如果我们尝试转换为十进制,则会出错。 ('2.81104e+006')。它仍然通过 ISNUMERIC 测试。

    SELECT ISNUMERIC('2.81104e+006') 返回 1。

    SELECT convert(decimal(15,2), '2.81104e+006') 返回错误:将数据类型 varchar 转换为 numeric 时出错。

    SELECT try_convert(decimal(15,2), '2.81104e+006') 返回 NULL。

    SELECT convert(float, '2.81104e+006') 返回正确的值 2811040。

    【讨论】:

      猜你喜欢
      • 2013-04-27
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 2011-03-29
      相关资源
      最近更新 更多