【问题标题】:Msg 8114, Level 16, State 5, Line 1 Error converting data type varchar to float消息 8114,级别 16,状态 5,第 1 行将数据类型 varchar 转换为浮点数时出错
【发布时间】:2019-07-30 18:03:14
【问题描述】:

我写了一个代码,根据 SQL Server 中的货币场景将成本转换为欧元。但是我收到此错误:

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

请帮帮我。

SELECT 
    WORK.dbo.['Parts Detail$'].PartNumber,
    WORK.dbo.['Parts Detail$'].COST,
    CASE 
       WHEN WORK.dbo.['Parts Detail$'].CURRENCY = 'GBP' 
          THEN (WORK.dbo.['Parts Detail$'].COST * 1.17)
       WHEN WORK.dbo.['Parts Detail$'].CURRENCY = 'USD' 
          THEN (WORK.dbo.['Parts Detail$'].COST * 0.87)
       WHEN WORK.dbo.['Parts Detail$'].CURRENCY = 'EUR' 
          THEN (WORK.dbo.['Parts Detail$'].COST * 1)
       ELSE ('NO CURRENCY AVAILABLE') 
    END AS CIFCOST
FROM
    ['Parts Detail$']

【问题讨论】:

  • CASE 在 T-SQL 中是一个返回单个原子值的 表达式 - 和 all 路径和返回的所有可能值 必须是相同的数据类型 - 这不是这里的情况!在三种情况下,您返回一个FLOAT - 但在ELSE 子句中,您返回一个字符串。 SQL Server 将选择具有最高数据类型优先级的数据类型 - 此处为 FLOAT - 并将尝试将所有其他返回值转换为该类型 - 因此出现错误消息..

标签: sql-server


【解决方案1】:

您的ELSE 子句可能会导致问题。只需返回NULL

       ELSE NULL END AS CIFCOST

【讨论】:

    【解决方案2】:

    你需要改ELSE ('NO CURRENCY AVAILABLE')

    SELECT WORK.dbo.['Parts Detail$'].PartNumber,
           WORK.dbo.['Parts Detail$'].COST,
           CASE 
                WHEN WORK.dbo.['Parts Detail$'].CURRENCY = 'GBP' THEN (WORK.dbo.['Parts Detail$'].COST*1.17)
                WHEN WORK.dbo.['Parts Detail$'].CURRENCY= 'USD' THEN (WORK.dbo.['Parts Detail$'].COST*0.87)
                WHEN WORK.dbo.['Parts Detail$'].CURRENCY='EUR' THEN (WORK.dbo.['Parts Detail$'].COST*1)
                ELSE null END AS CIFCOST
    FROM ['Parts Detail$']
    

    你不能在浮点类型中包含搅拌值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多