我们正在构建一个搜索表单供用户搜索我们的数据库,表单将包含mulitlpe字段,这些字段都是可选的。字段包括:
基本上,用户可以填写所有或部分字段并提交表单。我们应该如何最好地处理这个sql?是否最好使用动态sql,在我们的网页中构建where子句,然后将其转发到sql存储过程以使用where where子句?或者将所有值传递给存储过程并让它动态构建where子句更好。也是动态sql的唯一方法吗?我不确定使用EXECUTE(@SQLStatement)是否是一个好习惯。
答案 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