首页 > 解决方案 > 成功执行后出现错误:将表达式转换为数据类型 int 的算术溢出错误

问题描述

我正在阅读一篇关于如何巧妙地使用 sql 查询的 sql 文章,我得到了下面的文章,它正在计算阶乘,它适用于数字 5,但是当我更改为另一个大于 12 的数字时,它会推送错误:消息 8115,级别 16,状态 2,第 1 行将表达式转换为数据类型 int 的算术溢出错误。我认为 12 是数字 <=5 的总和,即 5 4 3 2 波纹管查询适用于所有 num<12 但是当我将 num 更改为大于 12 时,即使我更改条件“num < "

 with fact as (
        select 1 as fac, 1 as num
        union all
        select fac*(num+1), num+1
        from fact
        where num<12)
    select fac
    from fact
    where num=5

标签: sqlsql-server

解决方案


您的代码有点奇怪 - 计数然后使用外部where停止。

我只会输入一个数字并倒数。如果你使用decimal(38, 0),你可以走得更高:

with fact as (
        select cast(1 as decimal(38, 0)) as fac, 33 as num
        union all
        select fac * num, num - 1
        from fact
        where num > 0
       )
select max(fac)
from fact;

这将返回 8,683,317,618,811,886,495,518,194,401,280,000,000。对于大多数实际应用来说,这似乎足够大。


推荐阅读