将varchar值转换为数据类型数字时SQL转换失败
我在使用以下 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]
该ExecuteSubReport和ExecuteSymbolicMath是公司的职能。将ExecuteSymbolicMath基本剥离不必要的字符,比如$和逗号,做数学,并返回结果为一个字符串。该列的最终结果是 0-1 之间的小数点(2 位)。当我尝试运行查询时,我收到一条错误消息,指出它无法将 varchar 转换为数字。我已经尝试了我能想到的一切。我试过替换、转换、转换、str。
非常感谢您的帮助!
回答
SQL 表达式只有一种类型。甲case表达没有什么不同。
根据 SQL 的规则,数字胜过字符串,因此 SQL 尝试将字符串转换为数字——这就是正在发生的事情。
只需在表达式中使用'0'而不是:0case
(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]