Лучший способ выполнения динамического условного поиска в TSQL?

Здесь у нас большой запрос с несколькими параметрами, и для каждого из них запрос отличается только одной частью предложения where, например:

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.

Имейте в виду, что это находится в середине большего выбора.

Есть ли хороший способ очистить это, не помещая все это в одну большую конкатенированную строку sql и запуская на ней exec, или используя что-то абсурдное, например, несколько хранимых процедур на блок, как показано здесь: http://www.developerfusion.com/article/7305/динамическиеусловия-поиска-в-tsql/7/

Сервер - SQL Server 2008 R2. ТИА!


person Mike P.    schedule 09.09.2011    source источник
comment
Он никогда не проверяет, @IncludeNames = 0 ли? Что произойдет, если это так?   -  person Clockwork-Muse    schedule 10.09.2011
comment
sommarskog.se/dyn-search-2008.html   -  person Aaron Bertrand    schedule 10.09.2011
comment
Вы намерены разрешить применение более одного фильтра одновременно, например. по имени и размеру обуви?   -  person HABO    schedule 10.09.2011
comment
@ X-Zero, он проверяет этот случай, я просто забыл вставить его фрагмент сюда. Спасибо, что спросили!   -  person Mike P.    schedule 12.09.2011


Ответы (1)


Попробуйте настроить свой запрос с опцией всех или конкретных значений для каждого предложения, например.

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)

Это должно позволить вам объединить ваши предложения в один оператор выбора. Каждый параметр может применять фильтр или не иметь никакого эффекта (если установлено значение по умолчанию, например null, пустая строка или -1).

person Daryl Wenman-Bateson    schedule 09.09.2011
comment
Это может быть легче читать и упростить для оптимизатора, если различные условия фильтрации распределены по соответствующим предложениям ON во ВНУТРЕННИХ СОЕДИНЕНИЯХ. - person HABO; 10.09.2011