2017-09-14 24 views
0

私はいくつかの数式を持つ数式テーブルを持っています。すべての公式を評価し結果を与えることができるSQLストアドプロシージャを書くことは可能ですか?すべての数式は、すべての異なる算術演算を持つことができる式です。式で使用されるすべての値は、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-to-be)の可能な複製-evaluated-later-sql-server-2005) – ventiseis

+0

あなたが説明していることを実行するための素晴らしい方法はありません。私はこれがおもしろい例だと思います。あなたのユースケースを少し拡大できますか?任意の数式を格納し、計算された列のように戻す必要があるという代替方法があります。 – Xedni

+0

ユーザーがUIのドロップダウン値を選択することで独自の数式を作成できるようにしたUIがあり、ドロップダウン値のIDをテーブルに格納しているため、この数式を保存する方法はありません。ユーザーが作成したこれらの数式は、計算のために少数の場所で使用する必要があります。 1つの選択肢は、数式評価を達成するためにC#コードを書くことですが、このアプローチは時間がかかり、式に対して処理するために100万レコードが必要なため、データベースアプローチを検討しています –

答えて

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が正しいと仮定し、数式エントリの数値がValuesテーブルの値を検索するために使用されるキーである場合、使用する区切り文字を定義する必要がありますr数式文字列を入力し、数式を解析して置換を実行するルーチンを作成します。そして、結果として得られた文字列を上記のロジックに送ります。

TSQLはこの仕事には適切なツールではありません。

0

私はこれをSQLではなくアプリケーションで行うことを強くお勧めします。私には解決策がありますが、それはばかげています。私は、式を返すprocと、置き換える必要のある値を作成します。その後、.Replace()やregexライブラリを使ってタグを値に置き換えます(タグが整数の場合は問題に遭遇しますが、何らかの形でそれらをラップすることを考慮してください)。実行時に式を評価するには、いくつかの手法の1つを使用できます(いくつかのアイデアについては、Evaluating string "3*(4+2)" yield int 18を参照してください)。

私が知っていることは、主にC#で書かれていることに注意してください。異なる言語を使用している場合は、同等のものがあるはずです。