在我们的申请中,我们打算将允许用户在键入算术表达式 - 使用其他数据库列数字,这将随后通过该应用程序被解析并写入到数据库中作为计算列(+ * /)。

但也有与允许用户创建,当你select *表,如除以零,算术溢出,并可能别人我还没有碰到过但可能导致的异常表达出现问题(虽然我认为的这所有的)。

具有数据库扔在select *一个例外是,绝对是毁灭性的。我宁愿尝试其表达改写成的东西,如果他们有容易出错的数据,将优雅地失败。

有关除以零的溶液是非常简单的:

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

我的问题是我能为算术溢出呢?示出双层或明显错误的数据在列将不会是一个问题,但抛出异常会。

有帮助吗?

解决方案

我不愿看到你接受的答案,并没有真正让你更接近你的目标。

作为一个单独的答案可能帮助你一点,您可以让计算列调用(确定性)标量UDF。

请参阅,例如,这里

所以,如果你要创建一个计算列,使其通过列生成的UDF(或几个UDF)和做的工作有。在标量UDF,你可以有足够的代码来捕获问题,但你仍然无法使用TRY/CATCH。你可以在你的标量UDF做的是抓案件,并返回相应的答案(冒泡NULL,则可能)。

但性能将非常可怜的标量UDF(不知道不坚持内联计算列与UDF的,我们主要使用持续的),所以你可能要认真考虑使柱持续,然后将在数据库中使用的空间,使插入和更新慢一点。这是一个很大的权衡。

其他提示

既然你已经解析技术,您可以重新编写表达式来捕获所有与一群CASE语句的潜在问题 - 被零除,溢出,向上转型到不同类型,等等。

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

如果您已经解析表达,我会在客户端编译这个,太,以及处理一行一行地依据错误。

使用捕捉异常的 TRY / CATCH 是全有或全无的情况下,不能在一行接一行的基础。

如何捕获异常?这似乎很难尝试检测溢出的所有可能原因,更不用说例外一般。

在例外,可以返回一个无义结果集是兼容的原始用户定义之一:

begin try
    select exp(999)
end try
begin catch
    select 1
end catch 

如果性能是重要的,使用触发器或索引视图来存储计算当数据被插入,更新或删除。

如果性能并不重要,使用标量值函数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top