私は、同僚がさまざまなコストコンポーネントの計算方法を変更できるようにクエリを作成しようとしています。クエリの簡易版は、以下の通りです:ユーザー入力から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とFormulasをProductとStateに加わり、その式を評価したいと思いますが、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することはできません異なった州で販売されている製品の異なる数式。これは、状態にかかわらず製品ごとに1つの数式を返します。そして、条件付きの論理の束でも、それはかなりclunkyのようです。このような状況に近づけるより良い方法はありますか?
はい、セキュリティ上のリスクは明らかに注目に値します。私は、ユーザーがフィールド名と数学演算子の所定のセットを使用して数式を構築できるようにフォームを設定しました。また、計算を変更できるユーザーも非常に限られています。 現在、8つの計算が行われていますが、数値は増加し、潜在的にその2倍になります。 私は両方のアイデアを評価し、検討します。私は、動的SQLを使用することには賛成できません。 –
セキュリティ上の懸念がなくても、動的SQLは、今後数式が増え、実際にはコード作成が非常に迅速であるため、今後も最小限のメンテナンスになります。問題の反対側では、8または16の条件文でもコード化するのは難しくありません。がんばろう! – Matt