0

我有一段动态 SQL,其中一部分检索一个依赖于查询的其他结果的函数,但也使用这些结果来评估这个函数。我知道 eval() 在 SQL 中不存在,所以我用什么?

一个非常简化的版本

select reading, functiontype, @result = eval(f.functionformula)
from readingstables r
join functiontable f on (r.functiontype = f.functiontype)

所以基本上(注意这些只是示例公式)我想通过公式类型使用与一组读数相关的函数公式

如果 f.functiontype == 'A' then f.functionformula = reading * reading if f.functiontype == 'B' then f.functionformula = reading * costant / anothervalue //etc etc

实际版本是驱动游标的存储过程中的一大块动态 SQL。我宁愿在一个查询中执行此操作,但怀疑我可能不得不妥协并从第一个动态查询驱动第二个动态查询。

4

1 回答 1

1

为什么不简单地使用POWER功能:

Case functionType
    When 'A' Then Power( reading, 2 )
    When 'B' Then Power( reading, 3 )
    ...
    End

你甚至可以像这样变得超级花哨:

Power( reading, Ascii( functionType ) - Ascii('A') + 2 )

编辑

鉴于您对 OP 的更改,除了动态 SQL 之外,没有办法动态执行函数调用。您可以创建一个 UDF,它采用函数类型参数并执行正确的表达式,但是 UDF 本身需要是一个大的 Case 表达式。

Create Function FunctionTypeExpression( @FunctionType char(1) )
Returns float
As

Return Case @FunctionType
    When 'A' Then ..expression 1
    When 'B' Then ..expression 2
    ...

需要注意的是,您需要使函数的返回值与表达式中任何可能的返回类型兼容。希望它们都是数字。如果它们不是全部数字(或全部文本),则需要更详细地解释为什么不是这种情况。

于 2012-05-07T14:12:21.993 回答