クエリが多数の異なる列に依存する可能性がある場合、適切な単一の T-SQL ステートメントはありません。まともな実行計画のようなものを得るには、必要な正確な組み合わせを対象とする T-SQL が必要です。これを行う方法は、SQL を動的に構築することです。
次の 3 つのオプションがあります。
- ストアド プロシージャ内で T-SQL を生成し、それを使用
sp_ExecuteSQL
して実行します (正しいパラメーター化とクエリ プランの再利用を維持します)。
- そもそもストアド プロシージャを使用しないでください。C# で T-SQL を生成して実行します。
- ORMを使用する
最初のオプションは実行可能ですが、苦痛です。T-SQL は、実際にはこれを意図したものではありません。しかし、あなたはそれを行うことができます。例(省略):
declare @tsql nvarchar(4000) = 'select * from foo ...'
if @name is not null
set @tsql = @sql + ' and Name = @name'
if @region is not null
set @tsql = @sql + ' and Region = @region'
-- ...
exec sp_executesql @tsql,
N'@name nvarchar(50), @region int`,
@name, @region
C#オプションはStringBuilder
、必要な句とパラメータを追加するだけで、IMO-通常は経由ではるかに簡単です。
最後に、ORM (この場合は LINQ プロバイダー) を使用します。
IQueryable<Foo> foos = ctx.Foos;
if(name != null) foos = foos.Where(x => x.Name == name);
if(region != null) foos = foos.Where(x => x.Region == region);
// ...