使用许多过滤器过滤sql server表行

时间:2011-03-23 17:55:11

标签: c# jquery asp.net sql-server tsql

我有一个名为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(SELECT GenderId FROM @GenderTable))

         if(EXISTS(SELECT DegreeId FROM @DegreeTable))

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

如何避免所有IF语句?我有超过5个过滤器。这很无聊。有人有什么想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我假设您的查询返回符合条件的学生列表?如果是这样,一种方法是按照这种格式构建一个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应该和不应该做什么的好资源。