Sql Server的CONTAINS函数无法处理某些URL数据。
Sql Server的CONTAINS函数无法处理某些URL数据。
在我的Sql Server数据库中,我有一个包含一个nvarchar(4000)字段的表,称为DataStructure。
在这个表中,我有2条记录,其中DataStructure字段的数据如下:
记录1:
{"FileName":"ACO23004000","SourceUrl":"http://mysite/TEST.TIF"}
记录2:
{"FileName":"ACO23004000","SourceUrl":"http://mysite.fm/TEST.TIF"}
我尝试使用Contains命令(全文搜索)在Sql Server中搜索值ACO23004000,如下所示:
Select *
from MyTable
where CONTAINS(DataStructure, '"*ACO23004000*"')
查询只返回第一条记录,似乎文本中的“.fm”值阻止了对第二条记录的搜索。
我该如何解决这个问题?可能有些字符会阻止CONTAINS命令正常工作吗?
问题出现的原因是在一个json格式的文本字段上应用条件时,CONTAINS函数不能正常工作。解决方法是使用OPENJSON操作符来解析json数据,并在文件名上施加相应的条件。
以下是解决问题的代码示例:
SELECT MyTable.* FROM MyTable CROSS APPLY OPENJSON(DataStructure) WITH(FileName VARCHAR(20) '$.FileName') WHERE FileName = 'ACO23004000'
输出结果如下:
DataStructure |
---|
{"FileName":"ACO23004000","SourceUrl":"http://mysite/TEST.TIF"} |
{"FileName":"ACO23004000","SourceUrl":"http://mysite.fm/TEST.TIF"} |
你可以在OPENJSON操作符的WITH子句中为“SourceUrl”字段定义适合的类型,根据该字段的性质进行定义。
原文中还提到了使用全文索引的CONTAINS函数可以在少于1秒的时间内执行查询,但在存在8500万行数据和不同的json结构的情况下,并不适用于当前的情况。因此,需要类似于LIKE命令的功能(但速度更快,类似于带有全文索引的CONTAINS函数)。