【问题标题】:Search within all text in varchar(max) column在 varchar(max) 列中的所有文本中搜索
【发布时间】:2017-06-20 04:19:05
【问题描述】:

通过谷歌搜索,发现LIKE 运算符和CHARINDEX() 函数都只搜索 varchar(max) 列的前 8K。

  1. 这是正确的说法吗?
  2. 如果是这样,如何在不启用全文搜索功能的情况下在 varchar(max) 列的全文中搜索子字符串(如果这甚至有意义的话)?

更新:在 SQL Server 2008 (10.0.5538.0) 上搜索超过 8K 对我不起作用。

【问题讨论】:

  • 我刚刚处理了 8k 搜索限制问题,但它是在文本数据类型上,而不是在 varchar(max) 上。当我从 text 切换到 varchar(max) 时,charindex 工作得很好。 p.s.我正在使用 mssql 2005

标签: sql-server tsql varchar text-search varcharmax


【解决方案1】:

执行此操作的一种方法是在此表上创建一个视图,该视图使用 SUBSTRING 将该列划分为 8k 个块。除了这 0 个索引分区之外,从第 4k 个字符开始将列划分为 8k 个块。

然后您可以将LIKE 子句应用于这些列中的每一个,如果任何列匹配,则该行是匹配的。

这种方法有明显的局限性(搜索词必须小于 8k,搜索参数必须以通配符开头和结尾)但启用全文搜索才是真正的答案

【讨论】:

  • 这是一个有趣的方法,但是如果搜索字符串条目的第一部分进入一个块,其余部分进入下一个块怎么办?似乎我们需要一些额外的逻辑来处理这种情况。
  • 是的,我认为这实际上会使最大搜索词大小为 4k 而不是 8k
【解决方案2】:

我从来没有听说过这个限制!我只是测试它以确保我在 varchar(max) col 中插入了 10K 和 20K 的数据,并使用 like 搜索了前 8K 中没有出现的最后一部分,SQL Server 找到了该行。

所以第一个问题的答案是:NO

【讨论】:

  • 我做了很多相同的事情,但我的测试失败了。检查联机丛书,LIKE 和 CHARINDEX 的条目都表明它们仅适用于前 8000 个字符。我使用的是 SQL 2008。您使用的是什么版本?
  • SQL Server 2016 SP1
  • 可能已经改变。能不能查一下BOL,看看两者是否不再有限制?
  • 我在 SQL 2008 R2 和 SQL 2016 上对其进行了测试,并且可以正常工作。类似运营商的 MSDN 上的 Doku 也没有说明这个限制。您唯一的限制是搜索模式。在那里,您最多只能使用 8K。但是搜索到的值可以与 varchar(max) 可以容纳的一样大。 (我无法尝试 varbinary(max),因为我不知道如何对 varbinary 进行类似搜索...这怎么可能?)
  • 能否请您检查一下您的测试查询与this post 有何不同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 2011-10-09
相关资源
最近更新 更多