検索文字列をパラメーターとして渡す場合、1 つのステートメントでそれが null であるか、すべてではないかを確認できます。例えば:
select *
from MyTable
where MyColumn = @SearchString
or @SearchString is null;
これにより、パラメーターが null でない場合は一致するレコードが返され、null の場合はすべてのレコードが返されます。
case
別のオプションとして、いつでもwhere 句にステートメントを入れることができます。
それを超えて、本当に別のクエリが必要な場合は、確かに分岐できますがif
、クエリは CTE を宣言した直後のステートメントでなければなりません。したがって、if ステートメントの各ブランチにコピーまたは CTE とクエリを含める必要があります。
where句全体を渡して動的SQLとして実行することを考えている場合(編集:ORMタイプのsp_executesqlではなく、パラメータ化されていない連結文字列を意味します)、最初に上記の方法のいずれかを使用するようにリファクタリングを試みます。動的 SQLには固有の問題があります。動的 SQL は、多くの場合、最初は巧妙で洗練されたものに見えますが、他のオプションがどういうわけか悪いことが判明した場合にのみ、最後の手段として見なされることが多いです。