【问题标题】:Evaluate Arithmetic String Produces Arithmetic overflow error计算算术字符串产生算术溢出错误
【发布时间】:2020-08-19 22:29:44
【问题描述】:

首先,我们使用的是 Azure SQL DB(现在已经说过了)。

我们有一个存储数学字符串的计算表。 我试图通过 Exec 命令从数学字符串中获取答案。

简单示例EXEC ('select ' + '500*5000') 工作正常。

EXEC ('select ' + '7500000*10000000000') 也可以正常工作。

然而

EXEC ('select ' + '75000*1000000') 产生算术溢出错误

嗯?
第二个例子不是也导致 bigint 吗?为什么那个没问题?

据我所知,有一个后台进程可以动态确定结果数据类型的大小。在任何情况下,我们都需要确保不会因为溢出而导致计算错误。

我的问题是如何在任何评估中强制使用 bigint?

我试过了

EXEC ('select cast(' + '750000*1000000' + 'as bigint)')

EXEC ('select convert(bigint,' + '750000*1000000' + ')')

或者,我们可以调整一个设置来告诉服务器在评估中默认使用 bigint 吗?

【问题讨论】:

    标签: sql-server tsql azure-sql-database


    【解决方案1】:

    您需要在执行计算之前,而不是之后,对计算的组件执行 cast/convert,因为 SQL Server 返回的最大组件的结果计算这就是为什么当提供的组件之一已经是 bigint 时它起作用的原因。例如

    EXEC ('select ' + '750000*cast(1000000 as bigint)')
    
    -- or
    
    EXEC ('select ' + '750000*convert(bigint,1000000)')
    

    Reference

    【讨论】:

    • “SQL Server 返回计算的最大组件的结果,这就是为什么它在提供的组件之一已经是 bigint 时起作用的原因”我不知道。说得通。这确实给了我一个前进的方向。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多