クエリ文字列の作成は非常に単純で簡単ですが、アプリケーションが 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 つの解決策でよくある問題です)。私は通常、すべてのクエリをキャッチすることを好みますが、オプション (再コンパイル) を指定することを忘れないでください。