2012-05-07 15 views
0

動的SQLの一部には、クエリの他の結果に依存する関数を取得する部分がありますが、これらの結果を使用してこの関数を評価します。私はeval()がSQLに存在しないので、私は何を使用するのですか?SQL Server - 動的クエリで関数を評価する

非常に単純化されたバージョン

select reading, functiontype, @result = eval(f.functionformula) 
from readingstables r 
join functiontable f on (r.functiontype = f.functiontype) 

だから、基本的に(これらは一例に過ぎ式であることに注意してください)私はf.functiontype場合formulatype

を経由して測定値のセットに関連しているfunctionformulaを使用したいです== '' をf.functionformula =読ん*場合 を読んf.functiontype == 'B' を=本当のバージョン* costant/anothervalue //などなど

を読んf.functionformula抱擁ですeカーソルを駆動するストアド・プロシージャ内の動的SQLの部分。私は1つのクエリでそれを行うことを好むだろうが、私は妥協し、最初から2番目の動的クエリを駆動する必要があると思われる。

+0

あなたの最高のアプローチはおそらくあなたが言及しているものです。 。 。 2つの動的クエリ。最初の人は正しい関数を探します。 2番目はそれを使用します。これにより、関数の引数や戻り値の型にも柔軟に対応できます。 –

答えて

1

なぜ単にPOWER機能を使用しない:

Case functionType 
    When 'A' Then Power(reading, 2) 
    When 'B' Then Power(reading, 3) 
    ... 
    End 

あなたも、そうのような超空想得ることができます:あなたにあなたの変更を考える

Power(reading, Ascii(functionType) - Ascii('A') + 2) 

編集

をOPは、動的SQLを超えて、方法はありません動的に関数呼び出しを実行する。関数型パラメーターを取り、正しい式を実行するUDFを作成することもできますが、UDF自体は大きなCase式である必要があります。

Create Function FunctionTypeExpression(@FunctionType char(1)) 
Returns float 
As 

Return Case @FunctionType 
    When 'A' Then ..expression 1 
    When 'B' Then ..expression 2 
    ... 

これには、関数の戻り値を式の戻り値の型と互換性を持たせる必要があります。うまくいけば、彼らはすべて数値です。それらがすべて数値(またはすべてのテキスト)でない場合、なぜこれが当てはまらないのかについてのより詳細な説明が必要になります。

+0

私はそれが関数の単純化されたバージョンであると言っていたように、実際のバージョンは複数のパラメータを持っていてユーザーが管理しています。したがってデータベーステーブル –

+0

@EricHewett - これは実際に何をしようとしているか達成するために。彼らが本当に別の価値の力でなければ、公式を含めない方が良いでしょう。 – Thomas

+0

合意 - これを反映させるために質問を編集しました –