2012-05-07 70 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) 

所以基本上(注意,這些僅僅是例子公式)我想用它通過formulatype

如果f.functiontype與一組讀數的functionformula == 'A' 然後f.functionformula =讀取 讀數*如果f.functiontype == 'B' 然後f.functionformula =讀數* costant/anothervalue //等等等等

真正的版本是一個擁抱e驅動光標的存儲過程中的一段動態SQL。我寧願在一個查詢中執行該操作,但懷疑我可能必須妥協,並從第一個查詢驅動第二個動態查詢。

+0

你最好的方法可能是你提到的。 。 。兩個動態查詢。第一個查找正確的功能;第二個使用它。這給你靈活的函數參數,甚至返回類型。 –

回答

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,沒有辦法o動態執行一個函數調用。您可以創建一個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

同意 - 我編輯了這個問題,試圖反映這個問題 –