【问题标题】:Ignore Arithmetic Overflow in microsoft sql server忽略 microsoft sql server 中的算术溢出
【发布时间】:2012-01-23 12:22:30
【问题描述】:

我正在 SQLServer 中进行一些位操作。并且遇到了著名的“算术溢出”错误。情况是,我希望它溢出。如何告诉它允许溢出并忽略错误?

我正在做这个选择:

SELECT CONVERT(bigint, 0x8000000000000000)-1

我希望它返回 9223372036854775807(最大的 bigint),但它返回:

Arithmetic overflow error converting expression to data type bigint.

【问题讨论】:

  • 我不知道您的需求是什么,但您正在尝试将值 0x8000000000000000 转换为 bigint。该值超过了 bigint 的最大值(如您所知)。但这就是为什么你得到溢出。仅供参考:这有效:SELECT CONVERT(bigint, 0x7fffffffffffffff)

标签: sql-server tsql


【解决方案1】:

这个怎么样:

SET ARITHABORT OFF;
SET ARITHIGNORE ON;
SET ANSI_WARNINGS OFF;

SELECT ISNULL(CONVERT(bigint, 0x8000000000000000)-1, 9223372036854775807)

请参阅 ARITHIGNOREARITHABORT 上的 MSDN 参考

【讨论】:

  • 是的,我知道这是旧的,但它对我有用。由于一行中有一个坏列,应用程序中的查询失败。在我的情况下,最好将其返回为 NULL。谢谢@AdaTheDev!
【解决方案2】:

那个特定的表达式失败了,因为 -1 是一个 int & 所以你需要这样做;

select CONVERT(bigint, 0x8000000000000000)-CONVERT(bigint, -1)
-9223372036854775807

但这既不是最小值(因为 -1)也不是最大值;如果你想要 +ve 最大值;

select CONVERT(bigint, 0x7FFFFFFFFFFFFFFF)
9223372036854775807

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    相关资源
    最近更新 更多