我試圖以這樣一種方式構建查詢,即我的同事可以修改如何計算不同成本要素。查詢的簡化版本如下:從用戶輸入構建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在不同州銷售的產品的不同公式。無論狀態如何,這隻會爲每個產品返回一個公式。即使有一堆條件邏輯,它看起來也很笨重。有沒有更好的方法來處理這種情況?
是的,安全風險絕對值得注意。我設置了表單,以便用戶只能使用預定義的字段名稱和數學運算符來構建公式。這也是一組能夠改變計算的用戶。 我們目前正在進行8次計算,但數量會增加,可能會增加一倍。 我很欣賞並會考慮這兩個想法。我不會使用動態SQL,無論哪種方式最有效地完成工作。 –
沒有安全問題,隨着公式的增長,動態SQL將成爲您未來最小的整體維護,而且實際上代碼非常快。在問題的另一方面,8或16條件語句並不難編碼。祝你好運! – Matt