2017-03-10 5 views
0

HTMLラジオボタンとテキストボックスの値からキーと値のペアを作成し、そのペアを配列に挿入してその配列をSPのWHERE句に追加するSQLストアドプロシージャのパラメータ?キーと値のペアを動的に作成してから...

私は、起動時にSQL Server DB内の1つのテーブルを参照するダッシュボードアプリケーションを構築しています。これにより、単純な選択SPの結果が返されます。私はので、私は、私は1-4の間でフィールド名を選択することができ、それらをすることによってフィルタする値を与える必要があり、この時点ではしかし、「擬似コード」(ごめん)

DECLARE @SelectedDate NVARCHAR(50)  
    SELECT * FROM Tablename WHERE log_ts > @SelectedDate 

午前SQLにはかなり新しいです。

これらのフィールド名をラジオボタンとして設定し、注入を防止するために、アプリケーションの既知の値に対してこれらの入力をスクリーンしてから、入力のデフォルト値を挿入することを含めて、 私は、スクリーニングが完了したら配列[string、string]を設定し、その配列を配列[フィールド、値]としてSQLに渡すことを考えました(null値は決してありません)。私の脳は、のために正常に見える場所です

SELECT * 
    FROM TableName 
    WHERE [application_name] = [Mobile] 
    AND [login_id]=[*] 
    AND [log_ts]=[Datetime.Today] 
    AND [error_level]=[Exception] 

QueryArray = ["application_name","Mobile"] 
       ["login_id","*"] 
       ["log_ts","Datetime.Today"] 
       ["error_level","Exception"] 

はその後何とかこのようなwhere句にそれを渡し:送信され、すべてのペアはデフォルト値ですされているとき、配列は次のようになりたいですfor-eachまたはsomethingですが、SQLはかなり新しくなっています...もし私が見つけることができなかった前の記事への単なるリンクであっても、どんな助けも大いに評価されるでしょう...

+0

最後のステートメント 'SELECT f1、fn FROM TABLE WHERE f1 in( 'v1')とf2 in( 'v2')'のようにこのアプローチを試すことができます。しかし、私はまだあなたの要件を完全に理解しようとしています。それについてもう少し考えてみましょう。 –

+0

データの例と返されるものを表示する必要があります。日付を比較する場合は、 'NVARCHAR'ではなく、' DateTime'を使うべきです。また、 'field2'が存在しないときにあなたが望むものを教えてください。 –

+0

また、データベースワークロードの抽象化レイヤーとしてEntity Frameworkを使用することについて考えましたか? –

答えて

1

coalesce演算子と一緒にnull可能なパラメータを使用するように思えます。これは、既知のパラメータセットを持っていて、そのパラメータに対してフィルタリングしたい場合にうまく機能します。あなたが可能なすべてのフィールドを知っているのであればあなたは、あなたは、人々がをフィルタリングするために、あなたのUIに表示されるフィールド何先に知っていると仮定しているをサーチすることができ、あなたが実際にそのように手続きを行うことができます。

create procedure [dbo].[MySampleProcedure] 
    @Property1Value <yourDataType> = null, 
    @Property2Value <yourDataType> = null, 
    .... 
as 
begin 
    select 
      Col1, 
      Col2, 
      ... 
    from 
     [dbo].[YourTable] 
    where 
     Column1Value = coalesce(@Property1Value, Column1Value) 
     and Column2Value = coalesce(@Property2Value, Column2Value) 
     .... 
end 

これは、特定のパラメータを省略すると、指定したパラメータに基づいて一致させることができます。 UIからセットを受け取ったら、そのペアをパラメータにマッチさせることができ、あなたはレースに出ます。

フィールド名が動的(あらかじめわかっていない)の場合は、より難しい問題になります。その場合は、動的SQLにドロップして、必要な処理を実行し、パラメータ化されたSQLを使用して問合せを作成し、注入の試行を避ける必要があります。

+0

私はキー値の配列をsqlに渡す代わりに、各フィールドのパラメータを渡して、それらのパラメータをnullにすることができます。だから私は常に、同じ順序で、4つのパラメータを渡すだろう。 – tCoe

関連する問題