SQL Server - 评估动态查询中的函数

时间:2012-05-07 13:41:14

标签: sql sql-server

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

非常简化的版本

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

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

如果f.functiontype =='A'则f.functionformula =读*读 如果f.functiontype =='B'则f.functionformula = reading * costant / anothervalue     //等等

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

1 个答案:

答案 0 :(得分: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
    ...

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