2017-09-14 61 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#,因爲這就是我所知道的;但如果您使用的是其他語言,則應該有相同的內容。