Я предполагаю, что по вашему запросу возвращается список студентов, которые соответствуют критериям? Если это так, то одним из способов будет создание предложения 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.