将 varchar 值转换为数字数据类型时 SQL 转换失败

标签 sql sql-server

我在执行以下 SQL 查询时遇到一些困难:

SELECT
    SUM(ArTrnDetail.NetSalesValue) AS [Price],
    'ExecuteSubReport(813, 0, Job)' AS [LaborCost],
    'ExecuteSubReport(815, 0, Job)' AS [MaterialCost],
    'ExecuteSymbolicMath(LaborCost + MaterialCost)' AS [TotalCost],
    'ExecuteSymbolicMath(Price - (LaborCost + MaterialCost))' AS [Margin],
    CASE 
        WHEN SUM(ArTrnDetail.NetSalesValue) = 0 
            THEN 0
            ELSE 'ExecuteSymbolicMath(1 - (TotalCost / Price))'  <-- Where it's failing
    END AS [MarginPct]

ExecuteSubReportExecuteSymbolicMath 是公司功能。 ExecuteSymbolicMath 基本上去除不需要的字符,如 $ 和逗号,进行数学计算并将结果作为字符串返回。该列的最终结果是 0-1 之间的小数点(2 位)。当我尝试运行查询时,我收到一条错误消息,指出它无法将 varchar 转换为数字。我已经尝试了几乎所有我能想到的方法。我试过替换、转换、转换、str。

非常感谢您的帮助!

最佳答案

SQL 表达式只有一种类型。 case 表达式也不异常(exception)。

根据 SQL 的规则,数字胜过字符串,因此 SQL 会尝试将字符串转换为数字——这就是正在发生的事情。

只需在 case 表达式中使用 '0' 而不是 0:

(CASE WHEN SUM(ArTrnDetail.NetSalesValue) = 0 
      THEN '0'
      ELSE 'ExecuteSymbolicMath(1-(TotalCost/Price))'  <-- Where it's failing
  END) AS [MarginPct]

或者,如果你真的想要计算,去掉所有的单引号:

(CASE WHEN SUM(ArTrnDetail.NetSalesValue) = 0 
      THEN 0
      ELSE ExecuteSymbolicMath(1-(TotalCost/Price)) 
 END) AS [MarginPct]

关于将 varchar 值转换为数字数据类型时 SQL 转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65833799/

相关文章:

sql-server - Sql Server 2012 校准许可模型

sql-server - SQL Server 字符串比较

sql - 如何计算包含列的非聚集索引的 Num_Key_Cols ?

sql - Django Queryset __in 在列表中没有值

mysql - 复杂的 MySQL JOIN SELECT

c# - LINQ to Entities 无法识别方法 'System.String StringConvert(System.Nullable` 1[System.Double])

sql-server - 根据日期列表创建数据范围

sql-server - 无法连接到本地 SQL Server Express 2008 R2

mysql - 根据发送mysql通知的次数查找用户

sql - 我怎样才能摆脱这个查询中的 'ORA-01489: result of string concatenation is too long' ?