Фильтровать строки таблицы SQL Server, используя много фильтров - PullRequest
0 голосов
/ 23 марта 2011

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

Структура этой таблицы:

  StudentId   GenderId  DegreeId   NatioanlityId
       1            2          2           3
       ....

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

      StudentId LangaugeId
        1         1
        1         2
        1         3

А студент может выбрать один или несколько предметов для экзамена:

      StudentId      ExamId
       1              1
       1              2
       .... 

На моей странице asp.net я хотел бы отфильтровать студентов с помощью флажка, используя ajax например, студент с женским и мужским полом со степенью 1, говорящий на языке 1,2 ... Я фильтрую строки в хранимой процедуре, используя пользовательскую таблицу, и мне приходится использовать множество операторов IF, подобных этому if (EXISTS (ВЫБЕРИТЕ GenderId FROM @GenderTable))

         if(EXISTS(SELECT DegreeId FROM @DegreeTable))

         if(....)
        else
         if(...)

Как я могу избежать всех утверждений IF? У меня более 5 фильтров. Скучно. У кого-нибудь есть идеи?

Заранее спасибо.

1 Ответ

1 голос
/ 23 марта 2011

Я предполагаю, что по вашему запросу возвращается список студентов, которые соответствуют критериям? Если это так, то одним из способов будет создание предложения where в следующем формате

Where 
    (@Param1 IS NULL OR Field1 = @Param1)
    AND (@Param2 IS NULL OR Field2 = @Param2)

Это может показаться уродливым и неэффективным, в зависимости от того, сколько фильтров возможно по сравнению с используемым и как построена ваша индексация.

Другой вариант - использовать динамический SQL. Вы можете сгенерировать его либо в своем .net-коде, либо в хранимом в SQL процессе. В итоге получается что-то вроде:

Set @Query = /* base select statement */
If @Param1 IS NOT NULL
    Set @Query = @Query + 'AND Field1 = @Param1'
If @Param2 IS NOT NULL
    Set @Query = @Query + 'AND Field2 = @Param2'
Exec sp_executesql @Query, @ParamList, @Param1, @Param2

Это может быть еще сложнее для чтения и отладки, но обычно оно будет работать лучше, так как вы смотрите только на те поля, по которым фактически производится фильтрация. Однако, если вы используете динамический SQL, есть некоторые критические моменты, о которых вам нужно знать, поскольку атаки с использованием инъекций находятся в верхней части списка. http://www.sommarskog.se/dynamic_sql.html - хороший ресурс о том, что следует и чего не следует делать с динамическим SQL.

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