首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查计算列中的算术溢出量?

检查计算列中的算术溢出量?
EN

Stack Overflow用户
提问于 2009-12-21 18:36:06
回答 4查看 1.9K关注 0票数 0

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

但是,在允许用户创建表达式时会出现一些问题,当您select *表时,这些表达式可能会导致异常,例如除以零、算术溢出,以及其他我还没有遇到的问题(尽管我认为这是所有的问题)。

让数据库在select *上抛出异常绝对是毁灭性的。如果他们有容易出错的数据,我宁愿尝试把他们的表达改写成一些会优雅失败的东西。

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

代码语言:javascript
复制
add [Col] as case {divisor} when 0 then N'DIVIDE-BY-ZERO' else {expression} end

我的问题是,对于算术溢出,我能做些什么?在列中显示铺位或明显错误的数据不是问题,但抛出异常将是问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-22 18:05:28

我讨厌看到你接受一个没有真正接近你目标的答案。

作为一个单独的答案,您可以使用使计算列调用(确定性的)标量UDF。

例如,参见这里

因此,如果要创建计算列,请将这些列传递给生成的UDF (或几个UDF),并在那里完成工作。在标量UDF中,可以有大量代码来捕捉问题,但仍然不能使用TRY/CATCH。在标量UDF中,您可以做的是捕获案例并返回适当的答案(可能是冒泡的NULLs )。

但是,在标量UDF上,性能将非常差(不确定非持久化内联计算列相对于,我们主要使用持久化),因此您可能需要认真考虑使列持久化,然后使用数据库中的空间,并使插入和更新速度稍慢一些。这是一个很大的权衡。

票数 1
EN

Stack Overflow用户

发布于 2009-12-21 19:05:06

由于您有解析技术,所以您可以重写表达式,用一串案例语句来捕获所有潜在的问题-除以零、溢出、向不同类型的转换等等。

但是我不会这么做,因为我不认为把这些作为模式的一部分放到数据库中是个好主意,除非这个工具是一个代码生成工具,并且用户负责检查和测试表达式的边缘条件,就像它们包含在原始的数据库设计中一样。

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

使用TRY/CATCH捕获异常是一个全部或根本不存在的场景,而不是逐行捕获。

票数 1
EN

Stack Overflow用户

发布于 2009-12-21 18:50:56

去抓例外怎么样?似乎很难尝试检测所有可能导致算术溢出的原因,更不用说一般的异常了。

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

代码语言:javascript
复制
begin try
    select exp(999)
end try
begin catch
    select 1
end catch 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1941817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档