SQL存储过程中的表达式评估

时间:2017-09-14 17:29:43

标签: sql-server

我有一些配方表和一些公式。是否可以编写可以评估每个公式并给出结果的SQL存储过程?每个公式都是一个可以具有所有不同算术运算的表达式。公式中使用的每个值都是一个引用其他表

的id值
FormulaId     | Formula                       
--------------+-------------                  
1             | `1 * 3`                       
2             | `(2 + 3) * (4 + 1)`           
3             | `((2 + 3) * (4 + 1)) / 5`     
4             | `(4 + 1) - (3 + 1) - (2 + 1)` 

Id            | Value
--------------+-------------
1             | 5
2             | 10
3             | 15
4             | 20
5             | 25

结果应该是

FormulaId     | EvaluatedValue  
--------------+----------------
1             | 75
2             | 625
3             | 25
4             | -10

2 个答案:

答案 0 :(得分:0)

以下是评估存储在表格中的表达式的方法:

declare @SQL nvarchar(max) 

Declare @Result As Int 
Select @SQL = Formula
    From dbo.Formulae
    Where ID = 3
Set @SQL = 'select @x = ' + @SQL

exec sp_executesql @SQL, N'@x int out', @Result out

select @Result

假设Xendi和Prasad是正确的,并且公式条目中的数字是用于从Values表中查找值的键,那么您必须定义公式字符串中使用的分隔符,然后编写例程解析公式并进行替换。然后,您将结果字符串输入到我上面写的逻辑中。

尽管如此,TSQL并不适合这项工作。

答案 1 :(得分:0)

我强烈建议您在应用程序而不是SQL中执行此操作。我有一个解决方案,但它可笑地参与其中。我会创建一个返回公式的proc,以及需要替换的值。然后使用.Replace()或正则表达式库将值替换为值(注意,如果您的标记是整数,那么您将遇到麻烦;考虑将它们包装在某种类型的括号中)。然后,您可以使用几种技术之一在运行时评估表达式(有关一些想法,请参阅Evaluating string "3*(4+2)" yield int 18)。

注意,我列出了主要在C#中的内容,因为这是我所知道的;但是如果你使用不同的语言,应该有相同的东西。