Необязательные атрибуты в хранимой процедуре WHERE - PullRequest
0 голосов
/ 13 ноября 2011

У меня есть приложение, в котором пользователь может передать некоторые или все параметры, которые я запрашиваю, приложению. (По сути, он или она может прекратить предоставлять входные данные для различных фрагментов данных, когда они захотят.) На основании предоставленного ими ввода я хочу получить информацию из базы данных MS SQL 2008 только с параметрами, которые они мне дали.

Я представляю что-то подобное, но я не могу заставить его работать, и понятия не имею, может ли это вообще.

CREATE PROCEDURE [dbo].[SearchForSolution]
    @Input1 int = 0, 
    @Input2 int = 0,
    @Input3 int = 0,
AS
SELECT Name, SolutionValue
FROM MyTable
WHERE (IF @Input1 != 0) { BETWEEN LowValue AND HighValue }
      AND (IF @Input2 != 0) { BETWEEN LowValue AND HighValue }
      AND (IF @Input3 != 0) { < HighValue }         
RETURN 0

Очевидно, это не рабочий код, но он дает общее представление. Я хочу иметь возможность использовать переменную как часть предложения WHERE, но только если она не использует магическое число (которое в данном случае равно 0).

Я не очень знаком с возможностями SQL здесь и не уверен, возможно ли то, что я хочу сделать. Все, что я пробовал до сих пор, провалилось. Если я полностью иду по неверному пути, я был бы признателен за указатель в правильном направлении.

Ответы [ 3 ]

0 голосов
/ 13 ноября 2011

В одну сторону:

WHERE ( (@Input1 = 0) OR (@Input1 BETWEEN LowValue AND HighValue) )
  AND ( (@Input2 = 0) OR (@Input2 BETWEEN LowValue AND HighValue) ) 
  AND ( (@Input3 = 0) OR (@Input3 < HighValue) )

Вы также можете изменить эти @InputX = 0 условия на @InputX IS NULL, если хотите, чтобы 0 был доступен для использования во второй проверке.

0 голосов
/ 13 ноября 2011

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

Существует два способа решения этой проблемы: динамический SQL и статический SQL.До SQL 2005 было трудно найти решения для статического SQL, которые были бы простыми в написании и обслуживании и в то же время работали хорошо, и рекомендовалось использовать динамический SQL.В SQL 2008 все изменилось.Microsoft изменила OPTION (RECOMPILE) подсказки, чтобы она теперь работала так, как вы ожидаете.Однако в первоначальной реализации произошла серьезная ошибка, и для использования этой функции требуется как минимум CU5 SQL 2008 SP1 или SQL 2008 SP2.подходы к этой проблеме и их плюсы и минусы.

http://www.sommarskog.se/dyn-search-2008.html

Некоторые из приведенных здесь примеров отлично подойдут для небольших наборов данных, но я настоятельно рекомендую вам ознакомиться с этой статьей.

0 голосов
/ 13 ноября 2011

Вот подход ...

 SELECT 
     Name, 
     SolutionValue
 FROM 
     MyTable
WHERE
     //Compact syntax simple for optional equals filter
     FIELD1  = ISNULL(@Input1,FIELD1) 
     //intention clearer and let's you do more than equals      
     AND ( @Input2 IS NULL OR FIELD2 > @Input2 ) 
     //can be extended for Between... 
     AND ((@Input3 IS NULL or  @Input4 IS NULL)   OR  FIELD3 BETWEEN  @Input3 AND @Input4 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...