Лучший способ выполнения динамического условного поиска в TSQL? - PullRequest
2 голосов
/ 10 сентября 2011

У нас есть запрос с большим числом элементов, который имеет несколько параметров, и для каждого из них запрос отличается только на одну часть предложения 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/dynamic-search-conditions-in-tsql/7/

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

1 Ответ

2 голосов
/ 10 сентября 2011

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

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...