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

3

我遇到了以下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基本上会去掉不需要的字符,例如$和逗号,进行数学计算,并将结果作为字符串返回。在列的最终结果中,保留2位小数且该值应在0-1之间。 当我尝试运行查询时,出现了一个错误,说无法将varchar转换为numeric。 我已经尽力尝试了一切可以想到的方法,例如replace、convert、cast和str。

非常感谢您的帮助!


2
提示:CASE表达式的类型是什么?如果它是数字,那么 'ExecuteSymbolicMath(1-(TotalCost/Price))' 会被视为数字值吗? - Panagiotis Kanavos
@PanagiotisKanavos - 你真是个天才!我会发布答案。 - johnreeves
1
你正在传递字符串,而不是函数。我相信你想要删除围绕在你想让SQL解析为表达式的表达式周围的 ' 和 '。 - Conor Cunningham MSFT
1个回答

5

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]

我刚得出这个结论。这解决了我的问题。我会给你荣誉。谢谢大家! - johnreeves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接