【问题标题】:How to solve Msg 8115, Level 16, State 2, Line 2 Arithmetic overflow error converting expression to data type int.?如何解决 Msg 8115, Level 16, State 2, Line 2 将表达式转换为数据类型 int. 的算术溢出错误?
【发布时间】:2019-10-04 04:51:10
【问题描述】:

我有一个这样的公式。但公式有错误。请帮帮我。

select 
    [DAY] as [DAY],
    [Name] as [Name],
    ((cast([columnA] + [columnB] + [columnC] as bigint) * 1000) / NULLIF(8 * 1024 * 1048576, 0)) as [TotalColumn]
from 
    [TableA]

错误信息:

消息 8115,第 16 级,状态 2,第 2 行
将表达式转换为数据类型 int 的算术溢出错误。

【问题讨论】:

  • columnA、columnB、columnC是什么数据类型?你能给我们一些示例值(理想情况下会导致错误)吗?
  • 这是你的问题:NULLIF(8*1024*1048576,0)
  • 错误完全正确。 8*1024*1048576 不适合(m)任何当前系统上的 int
  • A列、B列、C列的内容是什么?你觉得NULLIF 在做什么?

标签: sql sql-server


【解决方案1】:

由于您的除数是一个大整数,我怀疑您需要除数也是一个大整数。由于您有一些整数文字,因此数学将尝试将其放入 int 中并且它太大了。但是,您可以强制除数为 bigint。

convert(bigint, 8) * 1024 * 1048576

【讨论】:

  • 这是你的公式。太大了是什么意思?这是没有意义的。如果这些数字不是您想要的,那么您需要将公式更改为应有的值。我为您提供了有关您收到错误消息的原因的答案。
【解决方案2】:

我不确定您最终要尝试什么,但您可以使用 NUMERIC 数据类型,因为结果可能包含小数位。

select 
'Monday' as [DAY],
'Septiana Fajrin' as [Name],
((cast('5' + '5' + '5' as Numeric) * 1000) / (convert(Numeric, 8) * 1024 * 1048576))as [TotalColumn]  

结果

DAY Name    TotalColumn
Monday  Septiana Fajrin 0.000064610503613

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-07
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多