Лучший способ выполнения динамического условного поиска в 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/dynamic-search-conditions-in-tsql/7/

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

1 2

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)

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