如何通过使用MS SQL 2012中的全文搜索过滤特定文本来查找行

时间:2018-01-29 12:24:18

标签: sql sql-server xml tsql sql-server-2012

我有通过在MS SQL中使用全文搜索过滤特定文本来查找行的要求。第一个要求是通过在xml列中搜索文本来查找行,第二个要求是通过搜索json列中的文本(nvarchar数据类型)来查找行。以下条件应返回结果。

XML Column
Criteria 1. Where Contains(XMLData,"1")
Criteria 2. Where Contains(XMLData,"/1/")
Criteria 3. Where Contains(XMLData,"<field>1</field>")

JSONDATA Column :
Criteria 1. Where Contains(JSONData,"1")
Criteria 2. Where Contains(JSONData,"/1/")
Criteria 2. Where Contains(JSONData,"PortalId:1")

我目前的实现是使用下面的查询,在运行数千条记录时会出现性能问题。除了以下代码之外还有其他方法吗?

XML QUERY
SELECT *
WHERE cast(XMLData as nvarchar(max)) LIKE '%/' + CONVERT(VARCHAR,'1') +'/%'

JSON QUERY
SELECT *
WHERE JSONDataLIKE '%/' + CONVERT(VARCHAR,'1') +'/%'

以下是此问题的示例表。

http://sqlfiddle.com/#!18/f65ef/1

1 个答案:

答案 0 :(得分:0)

我认为全文搜索不会对您有所帮助。您似乎正在寻找任何片段,例如/1/等技术术语。

尝试使用XML

 DECLARE @SearchFor VARCHAR(100)='1';

 SELECT * 
 FROM SettingsData
 WHERE xmldata.exist(N'//*[contains(text()[1],sql:variable("@SearchFor"))]')=1;

如果任何节点的内部text() 包含搜索词组,则会检查。但是找到内部带有1的任何值(例如,在某处有1的任何无关数字。)您可以搜索text()="1"并仅在字符串时执行contains长度超过一定的最小值。

这样的东西
WHERE xmldata.exist(N'//*[text()[1]=sql:variable("@SearchFor") or(string-length(text()[1])>=3 and contains(text()[1],concat("/",sql:variable("@SearchFor"),"/")))]')=1;

Json是 - 到现在为止 - 只不过是一个字符串,必须解析。借助v2016,Microsoft引入了JSON支持,但您使用的是v2012。查找JSON字符串LIKE的问题可能是,即使作为元素名称的一部分,您也会发现1。其余的如上所述......

 SELECT *
 FROM SettingsData
 WHERE jsondata LIKE '%' + @SearchFor + '%';