我试图以这样的方式构建查询,以便我的同事可以修改计算不同成本组件的方式。查询的简化版本如下:
SELECT
ProductWeight * ShippingCost As Shipping,
ExpectedRevenue * GRTRate * As GRT
FROM PriceTable
我想让用户控制Shipping和GRT的计算方式,所以我创建了第二个公式表:
State | Component | Formula
______________________________________________
NJ | Shipping | 'ProductWeight * ShippingCost'
NY | GRT | 'ExpectedRevenue * GRTRate'
用户可以通过Access前端中的表单修改这些公式。理想情况下,我想加入PriceTable和Formulas on Product and State并评估公式,但我还没有找到任何方法来完成这项工作,而AFAIK SQL并没有真正起作用。
我目前的解决方法是:
根据我在这里看到的关于构建动态查询的一些答案,我使用XML Path方法创建公式列表,如下所示:
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;'
虽然这样运行,但我不能对在不同州销售的产品应用不同的公式。无论状态如何,这将只返回每个产品的一个公式。即使有一堆条件逻辑,它看起来也很笨重。有没有更好的方法来解决这种情况?
答案 0 :(得分:1)
首先要非常小心地接受用户输入并在其上构建动态查询!这是一个非常大的安全风险,读取SQL注入等。
其次,您可以使用列中的信息来实际执行公式的唯一方法是动态sql。或者也许是案例陈述?真正涉及多少种方式和列?你能有一个可用的计算方法表并让用户选择他们想要的那个吗?然后,您可以编写一个基于其选择计算的案例陈述。或者根据他们的选择结合所有和多个选择陈述,以帮助您组织思路。
如果你真的想留在你所在的路线上并且安全性不是问题。只需使用更多动态sql并使用临时表来存储结果。所以有一个光标,用一个组来计算出所有不同的公式(或状态)。然后逐步执行该游标在select语句上构建一个附加条件(例如,state ='CA'或FormulaStatment ='ProductWeight * ShippingCost')然后将结果插入临时表。光标选择临时表后。