2016-06-13 7 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と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のようです。このような状況に近づけるより良い方法はありますか?

答えて

1

まず、ユーザーの入力を受け入れ、動的なクエリを作成することに非常に注意してください。これは非常に大きなセキュリティ上のリスクであり、SQLインジェクションなどで読むことになります。

第2に、実際に数式を実行するために列の情報を使用できる唯一の方法は、動的SQLです。代わりにケースステートメントか?どのように多くの方法と列が実際に関与していますか?利用可能な計算方法の表を用意して、ユーザーが希望の計算方法を選択できるようにしますか?次に、その選択に基づいて計算するcase文を書くことができます。または、あなたの考えを整理するのに役立つ選択肢に基づいて、すべての選択ステートメントと複数の選択ステートメントを結合します。

あなたが実際にあなたが乗っているルートに滞在したいと考えているならば、セキュリティは心配ではありません。よりダイナミックなSQLを使って前進し、一時テーブルを使用して結果を保存してください。だから、グループを持つ異なる数式(または状態)のすべてを把握するカーソルがあります。次に、選択したステートメント(たとえば、state = 'CA'またはFormulaStatment = 'ProductWeight * ShippingCost')に条件を追加してカーソルを作成し、結果を一時テーブルに挿入します。カーソルの後に一時テーブルを選択します。

+0

はい、セキュリティ上のリスクは明らかに注目に値します。私は、ユーザーがフィールド名と数学演算子の所定のセットを使用して数式を構築できるようにフォームを設定しました。また、計算を変更できるユーザーも非常に限られています。 現在、8つの計算が行われていますが、数値は増加し、潜在的にその2倍になります。 私は両方のアイデアを評価し、検討します。私は、動的SQLを使用することには賛成できません。 –

+0

セキュリティ上の懸念がなくても、動的SQLは、今後数式が増え、実際にはコード作成が非常に迅速であるため、今後も最小限のメンテナンスになります。問題の反対側では、8または16の条件文でもコード化するのは難しくありません。がんばろう! – Matt

関連する問題