代码之家  ›  专栏  ›  技术社区  ›  Tinister

检查计算列中是否存在算术溢出?

  •  0
  • Tinister  · 技术社区  · 15 年前

    在我们的应用程序中,我们将允许用户使用其他数据库列键入算术表达式(+-*/),然后由应用程序解析并作为计算列写入数据库。

    select * 表,例如除以零、算术溢出,以及我还没有遇到的其他可能的表(尽管我 就这些)。

    让数据库在上引发异常 挑选*

    对于除以零,解决方案非常简单:

    add [Col] as case {divisor} when 0 then N'DIVIDE-BY-ZERO' else {expression} end
    

    我的问题是我能为算术溢出做些什么?在列中显示bunk或明显错误的数据不会有问题,但抛出异常会有问题。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Cade Roux    15 年前

    我讨厌看到你接受一个不能让你离目标更近的答案。

    使计算列调用(确定性)标量UDF。

    比如说,, here

    TRY/CATCH . 在标量UDF中,您可以做的是捕捉案例并返回适当的答案(可能会冒出空值)。

    但表现会很好 非常

        2
  •  1
  •   Cade Roux    15 年前

    由于有了解析技术,您可以重新编写表达式,用一堆CASE语句捕获所有潜在的问题-除零、溢出、向上转换到不同的类型,等等。

    如果您已经在解析表达式,我也会在客户端编译它,并逐行处理错误。

    使用 尝试/抓住 是一个全有或全无的场景,而不是逐行。

        3
  •  0
  •   Jeff Meatball Yang    15 年前

    在异常情况下,可以返回与原始用户定义结果集兼容的无意义结果集:

    begin try
        select exp(999)
    end try
    begin catch
        select 1
    end catch 
    
        4
  •  0
  •   Brad    15 年前

    如果性能很重要,请在插入、更新或删除数据时使用触发器或索引视图来存储计算。