【问题标题】:Error converting data type varchar to float将数据类型 varchar 转换为 float 时出错
【发布时间】:2013-02-19 07:27:22
【问题描述】:

在SO上搜索和搜索,无法弄清楚
尝试 CASTING 每个字段作为 FLOAT 无济于事,转换没有让我进一步
如何让下面的 case 子句返回 THEN 部分中所述的值?

错误: 消息 8114,第 16 级,状态 5,第 1 行 将数据类型 varchar 转换为 float 时出错。

导致出错的 SQL 查询部分:

When cust_trendd_w_costsv.terms_code like '%[%]%' and (prod.dbo.BTYS2012.average_days_pay) - (substring(cust_trendd_w_costsv.terms_code,3,2)) <= 5 THEN prod.dbo.cust_trendd_w_costsv.terms_code

average_days_pay = 浮动
terms_code = 字符

干杯!

【问题讨论】:

  • 请发布您查询中使用的两个字段的数据样本。
  • 事情在 substring(cust_trendd_w_costsv.terms_code,3,2) 表达式中包含不正确的转换值

标签: sql sql-server tsql


【解决方案1】:

尝试使用ISNUMERIC处理无法转换的字符串:

When cust_trendd_w_costsv.terms_code like '%[%]%' 
and (prod.dbo.BTYS2012.average_days_pay) - 

(case when isnumeric(substring(cust_trendd_w_costsv.terms_code,3,2))=1 
         then cast(substring(cust_trendd_w_costsv.terms_code,3,2) as float)
         else 0
 end)
<= 5 THEN prod.dbo.cust_trendd_w_costsv.terms_code

【讨论】:

    【解决方案2】:

    您遇到的问题是您专门搜索包含% 字符的字符串,然后将它们(隐式或显式)转换为浮点数。

    但是包含% 符号的字符串不能转换为浮点数,因为它们仍然包含%。这也会产生错误:

    select CONVERT(float,'12.5%')
    

    如果您想转换为浮点数,您需要先删除% 符号,例如:

    CONVERT(float,REPLACE(terms_code,'%',''))
    

    只会消除它。我不确定您的 terms_code 列中是否还有其他字符也可能会出错。

    您还需要注意,SQL Server 可以非常激进地重新排序操作,因此可能会尝试对terms_code 中的其他字符串进行上述转换,即使是那些不包含% 的字符串。如果这是您的错误的根源,那么您需要防止这种激进的重新排序。如果不涉及聚合,CASE 表达式通常可以避免最严重的问题 - 在尝试转换之前,请确保您不想处理的所有字符串都被早期的 WHEN 子句消除

    【讨论】:

    • 发布了一些示例数据 - 我似乎无法更改百分号:/
    • @user2086052 - 仅供参考,请勿在 cmets 中发布示例数据 - 编辑您的问题。然后,您可以使用那里的工具对数据进行格式化,以便我们可以将其实际读取为表格。
    【解决方案3】:

    如果您确定 Substring Part 返回一个数值,您可以将 substring(....) 转换为 Float :

     .....and (prod.dbo.BTYS2012.average_days_pay) - (CAST(substring(cust_trendd_w_costsv.terms_code,3,2)) as float ) <= 5 ....
    

    【讨论】:

    • 示例数据 terms_code: NULL 1%1030 1%1560 1%30 1%3045 1%45 2%1030 2%1045 2%1060 CA CC DUR LEGALA NET10 NET30 NET45 NET60 average_days_pay: 0 46.975 46.555555 32.2 123.5 65。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2012-06-05
    相关资源
    最近更新 更多