我有一段动态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。我宁愿在一个查询中执行此操作,但怀疑我可能不得不妥协,并从第一个驱动器获得第二个动态查询。
答案 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
...
在这一点中,您需要使函数的返回值与表达式中的任何可能的返回类型兼容。希望它们都是数字的。如果它们不是全数字(或所有文本),则需要更详细的解释为什么不是这种情况。