【问题标题】:suggestions on how to build query for search with multiple options关于如何构建具有多个选项的搜索查询的建议
【发布时间】:2013-08-09 21:39:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    我过去所做的是,当不使用搜索选项时,传入 null 以获取其值。然后在你的选择语句中你会做类似的事情

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

    上面发生的情况是,如果 @CompanyNamenull i.companyname 将与自身进行比较,从而产生匹配。如果@CompanyName 有一个值,它会将i.companyname 与该值进行比较。

    我在一个有 15,000 行的数据库中使用了 15 个可选过滤器,并且迄今为止它的表现相对较好

    更多关于COALESCE 操作符

    【讨论】:

    • 老实说,这是我的首选方式,当我在超过 1 亿行的表上尝试此操作时,我不得不退回到动态 SQL。此外,该查询具有 Id 列表,因此还有“AND Ids IN (SELECT Ids from @TableParameter)”的内容,我可以使用动态 SQL 将其更改为“AND Ids IN (1,2,3)”。动态 SQL 将其从无法使用的缓慢变为闪电般的快速。不过之后我确实觉得很脏:/
    • 如果您只针对 SQL Server,我更喜欢 ISNULL 而不是 COALESCE 以获得性能,但除此之外 +1
    【解决方案2】:

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

    如果您无法从上述方法中获得性能并使用动态 SQL,请不要让网页构建 SQL 并执行它 - 您最终会被注入 SQL。还要避免传入文本字符串,因为清理它们非常困难。理想情况下,让网页传递仅是数字的参数(ID 等),以便您从中创建动态 SQL。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 2017-10-01
      • 2016-05-27
      • 2020-03-24
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多