绕过 TSQL CONTAINS 过滤

Posted

技术标签:

【中文标题】绕过 TSQL CONTAINS 过滤【英文标题】:Bypassing TSQL CONTAINS filtering 【发布时间】:2013-12-01 13:30:38 【问题描述】:

如果未指定搜索文本,是否有绕过结果集全文过滤的最佳做法?我现在要做的是:

SELECT * FROM items
WHERE @search='all' OR CONTAINS(*,@search)

不过不知道有没有更优雅的方式呢?

【问题讨论】:

你想在什么条件下搜索全部或包含(*,@search)。你有什么具体情况吗? 我想要返回所有行的条件是用户没有指定任何搜索字符串。当指定 serch 字符串时 - 我希望结果集由 CONTAINS 过滤 【参考方案1】:

您的示例是编写查询的最优雅方式。但是,您应该真正查看执行计划,看看这是否是最性能的方法。

您可能需要考虑编写这样的查询,以确保 SQL Server 在不需要时不会评估 CONTAINS 运算符。

if (@search = 'all')
    SELECT * FROM items
else
    SELECT * FROM items
    WHERE CONTAINS(*,@search)

【讨论】:

不是 mssql 查询优化器能够在定义明确的 TRUE OR 之后消除不必要的测试吗? 为什么我不希望在@search 为“全部”的情况下单独选择,因为我在几个全文子查询的 JOIN 中有这部分。因此,如果我将它们全部拆分-将有太多可能的组合(N^2,对于 3 个连接的子查询,将提供 9 个执行分支) OR 可能会短路,我只是建议您要格外安全。无论如何都要检查执行计划。 我检查了执行计划,它清楚地表明当@search 是'all' - 计划中没有全文搜索(否则它在那里)

以上是关于绕过 TSQL CONTAINS 过滤的主要内容,如果未能解决你的问题,请参考以下文章

TSQL - 过滤组,如果它包含所有空

如何从 TSQL UNPIVOT 中过滤值?

Tsql -> 从今天开始过滤 6 个月的数据,表中的日期字段为 YYYYMM

轻松更改 Java 中 Collections 接口中的 .contains() 方法以断言平等

sql注入 form过滤怎么绕过

SQL注入进阶练习常见绕过手段防御的解决方案