在我们的应用程序中,我们将允许用户使用其他数据库列为数字输入算术表达式(+ -* /),然后应用程序将其解析并作为计算列写入数据库。
但是,在允许用户创建表达式时会出现一些问题,当您select *表时,这些表达式可能会导致异常,例如除以零、算术溢出,以及其他我还没有遇到的问题(尽管我认为这是所有的问题)。
让数据库在select *上抛出异常绝对是毁灭性的。如果他们有容易出错的数据,我宁愿尝试把他们的表达改写成一些会优雅失败的东西。
对于除以零的方法,解决方案非常简单:
add [Col] as case {divisor} when 0 then N'DIVIDE-BY-ZERO' else {expression} end我的问题是,对于算术溢出,我能做些什么?在列中显示铺位或明显错误的数据不是问题,但抛出异常将是问题。
发布于 2009-12-22 18:05:28
我讨厌看到你接受一个没有真正接近你目标的答案。
作为一个单独的答案,您可以使用使计算列调用(确定性的)标量UDF。
例如,参见这里
因此,如果要创建计算列,请将这些列传递给生成的UDF (或几个UDF),并在那里完成工作。在标量UDF中,可以有大量代码来捕捉问题,但仍然不能使用TRY/CATCH。在标量UDF中,您可以做的是捕获案例并返回适当的答案(可能是冒泡的NULLs )。
但是,在标量UDF上,性能将非常差(不确定非持久化内联计算列相对于,我们主要使用持久化),因此您可能需要认真考虑使列持久化,然后使用数据库中的空间,并使插入和更新速度稍慢一些。这是一个很大的权衡。
发布于 2009-12-21 19:05:06
由于您有解析技术,所以您可以重写表达式,用一串案例语句来捕获所有潜在的问题-除以零、溢出、向不同类型的转换等等。
但是我不会这么做,因为我不认为把这些作为模式的一部分放到数据库中是个好主意,除非这个工具是一个代码生成工具,并且用户负责检查和测试表达式的边缘条件,就像它们包含在原始的数据库设计中一样。
如果您已经在解析表达式,我也会在客户端编译这个表达式,并在逐行的基础上处理错误。
使用TRY/CATCH捕获异常是一个全部或根本不存在的场景,而不是逐行捕获。
发布于 2009-12-21 18:50:56
去抓例外怎么样?似乎很难尝试检测所有可能导致算术溢出的原因,更不用说一般的异常了。
在异常情况下,可以返回与原始用户定义的结果集兼容的无意义结果集:
begin try
select exp(999)
end try
begin catch
select 1
end catch https://stackoverflow.com/questions/1941817
复制相似问题