2016-06-13 80 views
0

我試圖以這樣一種方式構建查詢,即我的同事可以修改如何計算不同成本要素。查詢的簡化版本如下:從用戶輸入構建SQL查詢

SELECT 
    ProductWeight * ShippingCost As Shipping, 
    ExpectedRevenue * GRTRate * As GRT 
FROM PriceTable 

我想允許用戶控制如何運輸和GRT計算,所以我創建公式的第二個表:

State | Component | Formula 
______________________________________________ 
NJ | Shipping | 'ProductWeight * ShippingCost' 
NY | GRT  | 'ExpectedRevenue * GRTRate' 

用戶就能夠通過Access前端中的表單修改這些公式。理想情況下,我想加入PriceTable和產品和狀態公式並評估公式,但我還沒有找到任何方法來完成這項工作,而AFAIK SQL實際上並非如此。

目前的解決方法,我有:

基於一些答案我在這裏看到關於建立動態查詢,我使用的XML路徑方法來創建公式的列表,像這樣:

Declare @formulas As nvarchar(max) 
Set @formulas = (
    SELECT DISTINCT Formula + ' As ' + Component + ',' As [text()] 
    FROM Formulas 
    For XML Path('') 
) 
Set @formulas = LEFT(@formulas, len(@Formulas)-1) 

然後,我創建了一個使用該公式建立查詢一個變量:

Declare @query As nvarchar(max) 
@query = 'SELECT ' + @formulas + ' FROM PriceTable;' 

雖然這跑,我不能APPL y在不同州銷售的產品的不同公式。無論狀態如何,這隻會爲每個產品返回一個公式。即使有一堆條件邏輯,它看起來也很笨重。有沒有更好的方法來處理這種情況?

回答

1

首先要非常小心地接受用戶輸入並建立動態查詢!這是一個相當大的安全風險,請閱讀SQL注入等。

其次,您可以使用列中的信息來實際執行公式的唯一方法是動態sql。或者也許是病例陳述?真正涉及到多少種方式和專欄?你可以有一個可用的計算方法表,並讓用戶選擇他們想要的嗎?然後你可以編寫一個基於他們的選擇計算的案例陳述。或根據他們的選擇將所有和多個選擇陳述聯合起來,無論哪一個將幫助您組織您的想法。

如果你真的想留在你正在的路線上,安全不是問題。只需繼續使用更多動態SQL並使用臨時表來存儲結果即可。所以有一個遊標可以指出所有不同的公式(或狀態)。然後逐步通過該遊標,在您的select語句上創建附加條件(例如where state ='CA'或FormulaStatment ='ProductWeight * ShippingCost'),然後將結果插入臨時表。在光標後選擇你的臨時表。

+0

是的,安全風險絕對值得注意。我設置了表單,以便用戶只能使用預定義的字段名稱和數學運算符來構建公式。這也是一組能夠改變計算的用戶。 我們目前正在進行8次計算,但數量會增加,可能會增加一倍。 我很欣賞並會考慮這兩個想法。我不會使用動態SQL,無論哪種方式最有效地完成工作。 –

+0

沒有安全問題,隨着公式的增長,動態SQL將成爲您未來最小的整體維護,而且實際上代碼非常快。在問題的另一方面,8或16條件語句並不難編碼。祝你好運! – Matt