尝试取平均值时算术溢出

时间:2017-11-17 20:09:28

标签: sql sql-server sql-server-2012

尝试执行查询时出现以下错误

  

将nvarchar转换为数据类型numeric

的算术溢出错误

我已将问题缩小到包含的代码。我的问题是我不确定如何处理溢出错误。任何帮助,将不胜感激。谢谢。

avg(cast((Substring([Ice].Entry(5, UD03.Character01,';'),0,
CharIndex('|',[Ice].Entry(5, UD03.Character01,';'))))
as decimal(38,38))) as [Calculated_Markup]

1 个答案:

答案 0 :(得分:1)

使用try_cast()try_convert()

avg(try_convert(decimal(38, 38),
                Substring([Ice].Entry(5, UD03.Character01,';'), 1,
                          CharIndex('|', [Ice].Entry(5, UD03.Character01, ';')))) as [Calculated_Markup]

注意:我将0更改为1,因为子字符串处理从1开始。您可以使用LEFT()更简洁地编写此代码:

avg(try_convert(decimal(38, 38),
                left([Ice].Entry(5, UD03.Character01,';'),
                     CharIndex('|', [Ice].Entry(5, UD03.Character01, ';')))) as [Calculated_Markup]

注意:如果转换失败,则使用NULL修复错误。

我会注意到decimal(38, 38)有点不寻常 - 这是一个在小数点后只有38位的数字。通常在小数点之前有更多的数字,所以我希望更像decimal(38, 15)。这将是之后的23位和之前的23位。