2017-09-14 59 views
0

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

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

[在以后要评估的数据库中存储公式(公式)(SQL Server 2005)](https://stackoverflow.com/questions/9722782/storing-formula-equations-in-database-tobe -evaluated-later-sql-server-2005) – ventiseis

+0

有没有一种很好的方式来做你所描述的。我觉得这是一个玩具的例子。你能稍微扩展你的用例吗?可能需要存储任意公式并使其像计算列一样返回。 – Xedni

+0

没有替代存储这个公式截至目前,我们拥有它允许用户创建自己的公式UI(通过选择一些下拉在UI值),我们存储相当于到表中的下拉值的标识。用户创建的这些公式需要在少数地方用于计算。一种替代我们是写C#代码实现公式估计,但由于这种方法耗时,我们将有一百万条记录处理针对公式,我们正在寻找出数据库的方法 –

回答

0

这里是你如何评估存储在表表达式中的ID:

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是正确的,并且公式条目中的数字是用于查找值表中的值的键,那么您必须定义您使用的分隔符r公式字符串,然后编写一个例程来解析公式并进行替换。然后你会将结果字符串提供给我上面写的逻辑。

所有这些话,TSQL不是这份工作的正确工具。

0

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

请注意,我列出的东西主要是C#,因为这就是我所知道的;但如果您使用的是其他语言,则应该有相同的内容。