1

動的フィルターを使用したクエリの現在の代替手段は何ですか? 例えば:

SELECT cost
FROM tblData
WHERE Filter1 in (3,5,6,7)
AND Filter2 in (20,11,66,24)
AND Filter3 in (50,22,66,33)

など... Filter2、Filter1、または Filter3 がない場合があります (パラメーターによって異なります)。私の実際のシナリオでは、最大 10 個のフィルターを使用できます。上記はほんの一例です。

このクエリをテキストのように構築し、EXEC で実行しない新しいアプローチはありますか?

ありがとう!

4

3 に答える 3

1

値を使用する別の方法がありnullます。

例えば:

WHERE (@filter Is Null OR table.column <> @filter)
  AND (@filter2 Is Null OR table.column2 <> @filter2)

ただし、多くの列をフィルタリングすると、パフォーマンスが影響を受ける可能性があります。キャッチオール クエリを参照してください。

于 2014-08-13T14:49:05.180 に答える
0

次の形式で SQL クエリでフィルターを使用しました。

declare @filter1 as Int
declare @filter2 as Int
declare @filter3 as Int

set @filter1 = 39
set @filter2 = 84
set @filter3 = null

select *
from Table1 T1
     inner join Table2 T2 on T1.Id = T2.T1_Id
     inner join Table3 T3 on T2.Id = T3.T2_Id
where     T1.Id = isnull(@filter1, T1.Id)
      and T2.Id = isnull(@filter2, T2.Id)
      and T3.Id = isnull(@filter3, T3.Id)

しかし、大量の情報がある場合、SQL Server はクエリを正しい方法で把握できず、データベースにある正しいインデックスを使用しません。

次の形式でクエリを使用することをお勧めします。

declare @filter1 as int
declare @filter2 as int
declare @filter3 as int

set @filter1 = 39
set @filter2 = 84
set @filter3 = null

--Dynamic Query Begin
declare @query as varchar(max)

set @query = '
select *
from Table1 T1
     inner join Table2 T2 on T1.Id = T2.T1_Id
     inner join Table3 T3 on T2.Id = T3.T2_Id
where T1.Id = T1.Id '

if @filter1 is not null
    set @query = @query + ' and T1.Id = ' + convert(varchar(10),@filter1)

if @filter2 is not null
    set @query = @query + ' and T2.Id = ' + convert(varchar(10),@filter2)

if @filter3 is not null
    set @query = @query + ' and T3.Id = ' + convert(varchar(10),@filter3)

exec sp_executesql @query
--Dynamic Query End
于 2014-08-13T15:23:26.947 に答える
0

パラメータを介して動的にSQLを生成し、次にEXEC(@sql)を使用してみてください

sqlserver2005 を使用する場合は、EXEC SP_EXECUTESQL @sql、SP_EXECUTESQL をより強力に使用できます

于 2014-08-13T14:51:53.507 に答える