【问题标题】:SQL Conversion failed when converting the varchar value to data type numeric将 varchar 值转换为数据类型 numeric 时 SQL 转换失败
【发布时间】:2021-04-26 05:59:43
【问题描述】:

我在使用以下 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。

非常感谢您的帮助!

【问题讨论】:

  • 提示:CASE 表达式的类型是什么?如果是数字,'ExecuteSymbolicMath(1-(TotalCost/Price))' 将如何被视为数字值?
  • @PanagiotisKanavos - 你是个天才!我会发布答案。
  • 您传入的是字符串,而不是函数。我相信您想删除您希望 SQL 解析为表达式的表达式周围的 ' 和 '

标签: sql sql-server


【解决方案1】:

SQL 表达式只有一种类型。 case 表达式也不例外。

根据 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]

【讨论】:

  • 我刚得出这个结论。这解决了我的问题。我会给你信用。谢谢大家!
猜你喜欢
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2011-12-01
  • 2016-09-21
  • 2012-04-10
  • 1970-01-01
相关资源
最近更新 更多