我有一些配方表和一些公式。是否可以编写可以评估每个公式并给出结果的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
答案 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#中的内容,因为这是我所知道的;但是如果你使用不同的语言,应该有相同的东西。