有关如何使用多个选项构建搜索查询的建议

时间:2013-08-09 13:17:32

标签: sql sql-server tsql

我们正在构建一个搜索表单供用户搜索我们的数据库,表单将包含mulitlpe字段,这些字段都是可选的。字段包括:

  1. 公司名称
  2. 公司代码
  3. 业务类型(服务或产品)
  4. 产品或服务
  5. 产品或服务子类型 - >这将取决于#4
  6. 中选择的内容

    基本上,用户可以填写所有或部分字段并提交表单。我们应该如何最好地处理这个sql?是否最好使用动态sql,在我们的网页中构建where子句,然后将其转发到sql存储过程以使用where where子句?或者将所有值传递给存储过程并让它动态构建where子句更好。也是动态sql的唯一方法吗?我不确定使用EXECUTE(@SQLStatement)是否是一个好习惯。

2 个答案:

答案 0 :(得分:3)

我过去所做的是当没有使用搜索选项时,在null中传递其值。然后在您的select语句中,您将执行类似

的操作
 WHERE i.companyname = COALESCE(@CompanyName,i.companyname) 
   AND i.companycode = COALESCE(@CompanyCode,i.companycode)

以上情况是,如果@CompanyName null i.companyname将与自身进行比较,从而导致匹配。如果@CompanyName有值,则会将i.companyname与该值进行比较。

我在数据库中使用了15个可选过滤器,使用这种方式,行数为15,000行,迄今为止表现相对较好

有关COALESCE运算符

的更多信息

答案 1 :(得分:2)

动态SQL不是唯一的方法,如果你可以通过以下方法来避免它,那会更好:http://www.sommarskog.se/dyn-search.html

如果你无法从上面的方法中获得性能并且去动态SQL,那么不要让网页构造SQL并执行它 - 你最终会得到SQL注入。还要避免传入文本字符串,因为对它们进行清理非常困难。理想情况下,网页传递的参数只是数字(ID等),您可以从中创建动态SQL。

如果您决定使用动态SQL,请务必阅读以下所有内容:http://www.sommarskog.se/dynamic_sql.html