Лучший способ выполнения динамического условного поиска в 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 ответ:
Попробуйте настроить запрос с параметром всех или определенных значений для каждого предложения, например
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).