У меня есть запрос SQL, который принимает эти параметры:
@SearchFor nvarchar(200) = null
,@SearchInLat Decimal(18,15) = null
,@SearchInLng Decimal(18,15) = null
,@SearchActivity int = null
,@SearchOffers bit = null
,@StartRow int
,@EndRow int
Переменные @SearchFor
, @SearchActivity
, @SearchOffers
могут быть либо нулевыми, либо ненулевыми. @SearchInLat
и @SearchInLng
должны оба иметь значение NULL или оба имеют значения.
Я не собираюсь публиковать весь запрос как скучный и трудный для чтения, но предложение WHERE имеет такую форму:
( -- filter by activity --
(@SearchActivity IS NULL)
OR (@SearchActivity = Activities.ActivityID)
)
AND ( -- filter by Location --
(@SearchInLat is NULL AND @SearchInLng is NULL)
OR ( ... )
)
AND ( -- filter by activity --
@SearchActivity is NULL
OR ( ... )
)
AND ( -- filter by has offers --
@SearchOffers is NULL
OR ( ... )
)
AND (
... -- more stuff
)
Я читал, что это плохой способ структурировать запрос - что у SqlServer есть проблема при разработке эффективного плана выполнения с множеством подобных предложений, поэтому я ищу другие способы сделать это.
Я вижу два способа сделать это:
- Создайте запрос в виде строки в моем клиентском приложении, чтобы предложение
WHERE
содержало фильтры только для соответствующих параметров. Проблема в том, что это означает отсутствие доступа к базе данных с помощью хранимых процедур, как и все остальное на данный момент.
- Измените хранимую процедуру так, чтобы она проверяла, какие аргументы имеют значение null, и выполняет дочерние процедуры в зависимости от того, каким аргументам она передана. Проблема здесь в том, что это будет означать многократное повторение в определении процедур и, следовательно, будет труднее поддерживать.
Что мне делать? Или мне просто продолжать, как я сейчас делаю? У меня установлено OPTION (RECOMPILE)
для процедур, но я слышал, что это не работает прямо в Server 2005. Кроме того, я планирую добавить больше параметров в этот процесс, поэтому я хочу убедиться, что любое решение, которое у меня есть, является справедливым масштабируемая.