4

基本的に、SQL データベースからアイテムのリストを作成する必要がありますが、ユーザーは 7 つのフィルターの任意の組み合わせでフィルター処理することを選択でき、並べ替える列と方向による並べ替えも選択できます。

ご想像のとおり、これはコード化するための多数の異なる組み合わせで終わり、データセットは非常に大きいため、アプリケーションでこれを行うことは避けたいと思います。

これまでのストアドプロシージャでは、次のことを試しました。

  • クエリ文字列の作成は非常に単純で簡単ですが、アプリケーションが SQL インジェクションに対して無防備なままになるため、これは避けたいと思います。

  • 一連のIF ELSEステートメントを使用して適切なパラメーター化された SQL を実行しますが、これはすぐに巨大なツリーになり、維持するのは悪夢になります。

このような解決策を必要としたのは私が初めてではなく、上記よりも良い方法があるはずですか? IFまた、副次的な質問として、多くのsを実行する以外に、パラメーター化された方法で順序による順序と方向による順序を行う良い方法はありますか?

4

2 に答える 2

2

クエリ文字列の作成は非常に単純で簡単ですが、アプリケーションが SQL インジェクションに対して無防備なままになるため、これは避けたいと思います。

sp_executesqlを使用して、パラメーターをその sproc に引数として渡す場合はそうではありません。パラメータとしてデータを指定するため、SQL インジェクションは発生しません。

http://sqlinthewild.co.za/index.php/2009/04/03/dynamic-sql-and-sql-injection/

http://blogs.msdn.com/b/raulga/archive/2007/01/04/dynamic-sql-sql-injection.aspx

また、一連の IF ELSE ステートメントを使用して適切なパラメーター化された SQL を実行しようとしましたが、これはすぐに巨大なツリーになり、維持するのは悪夢になります。

IF ELSE を使用する場合は同意しますが、すべてのクエリをキャッチするというパターンもあります

WHERE (ProductID = @Product Or @Product IS NULL)
AND (ReferenceOrderID = @OrderID OR @OrderID Is NULL)
...

詳細はこちら http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/

最後に OPTION (RECOMPILE) を必ず指定してください。そうしないと、クエリがパラメーター スニッフィングと呼ばれるものに苦しむ可能性があります。

Also as a side question is there a good way to do order by and order by direction in a parameterised way, besides doing lots of IFs?

SQL ストアド プロシージャ内の動的並べ替えの重複の可能性

最終的には、sp_executesql を使用するか、すべてのクエリをキャッチできます (これは、これら 2 つの解決策でよくある問題です)。私は通常、すべてのクエリをキャッチすることを好みますが、オプション (再コンパイル) を指定することを忘れないでください。

于 2012-06-13T11:41:21.193 に答える
2

フィルタリングの場合は、 を使用しCOELSCEて条件を任意に組み合わせてフィルタリングします。ストアド プロシージャには、ユーザーが検索するすべてのパラメーターのリストがあり、クエリでは次のようになります。

 SELECT * 
 FROM YourTable t
 WHERE 1 = 1
 AND t.FirstColumn = COALESCE(@FirstColumnParam, t.FirstColumn)
 AND t.SecodndColumn = COALESCE(@SecondColumnParam, t.SecondColumn) 
 ....

いずれかのパラメーターが null の場合、条件はスキップされます。そのため1=1、フィルター条件がクエリに渡されない場合があります。

並べ替えの場合: ステートメントを使用してCASE、選択した列で並べ替えることができます。

ORDER BY ( CASE WHEN @OrderByParam = 1 Then FirstColumn ELSE .... END)
于 2012-06-13T11:42:00.570 に答える