2011-09-09 3 views
2

我々はいくつかのparamsをここから大っぽいクエリを持っており、それぞれ1のために、クエリがだけなので同様に、where句の一部によって異なりますTSQLで動的条件付き検索を実行する方がいいですか?

CASE WHEN @IncludeNames = 1 AND @NameFilter IS NULL THEN

(SELECT blah FROM blahBlah

INNER JOIN ... 
    INNER JOIN ... 
    INNER JOIN ... 
    WHERE blahBlah.Id = x.Id) 

WHEN @IncludeNames = 1 AND @NameFilter IS NOT NULL THEN

(SELECT blah FROM blahBlah

INNER JOIN ... 
    INNER JOIN ... 
    INNER JOIN ... 
    WHERE blahBlah.Id = x.Id 
    AND table2.Id = @NameFilter 

これは、いくつかのインスタンスでは、where句の条件が1つだけ異なるだけです。

これは大きな選択の途中です。ここに示されているよう

一つの大きな連結SQL文字列にそれをすべてを配置し、その上でexecを実行している、またはブロックごとに複数格納されてprocsのような不条理なものを使用せずに、これをクリーンアップする良い方法は、あります:http://www.developerfusion.com/article/7305/dynamic-search-conditions-in-tsql/7/

サーバーはSQL Server 2008 R2です。 TIA!

+0

'@IncludeNames = 0'をチェックすることはありませんか?その場合はどうなりますか? –

+1

http://www.sommarskog.se/dyn-search-2008.html –

+0

一度に複数のフィルタを適用できるようにすることは意図していますか?名前と靴サイズで? – HABO

答えて

2

各節のすべてまたは特定の値のオプションを使用してクエリを設定してみてください。

SELECT x.* 
FROM x 
WHERE (x.id = @NameFilter 
OR  @NameFilter is null) 
AND (x.typeId = @typeFilter 
OR  -1 = @typeFilter) 
AND (x.date = @date 
OR  @date is null) 
AND (x.someStingType = @someStringType 
Or  '' = @someStringType) 

これにより、句を1つのselect文に連結することができます。各パラメータは、フィルタを適用するか効果を持たないかもしれません(null、空の文字列または-1などのデフォルトに設定されている場合)。

+1

さまざまなフィルタ条件がINNER JOINの適切なON句に広がっている場合、これは読みやすく、オプティマイザで簡単です。 – HABO

関連する問題