Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como encontrar linhas filtrando um texto específico usando a pesquisa de texto completo no MS SQL 2012


Não acho que uma pesquisa de texto completo te ajudaria. Parece que você está procurando por qualquer fragmento, mesmo como termos técnicos como /1/ .

Tente isso para XML
 DECLARE @SearchFor VARCHAR(100)='1';

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

Ele verificará o text() interno de qualquer nó se contiver a frase de pesquisa. Mas qualquer valor com um 1 dentro for encontrado (por exemplo, qualquer número não relacionado que tenha um 1 em algum lugar.) Você pode procurar por text()="1" e execute o contains somente se o comprimento da string exceder um determinado mínimo.

Algo como
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 é - até agora - nada mais do que uma string e deve ser analisado. Com a v2016, a Microsoft introduziu o suporte a JSON, mas você está na v2012. O problema com um LIKE search em uma string JSON pode ser que você encontre o 1 mesmo como parte do nome de um elemento. O resto é como acima...
 SELECT *
 FROM SettingsData
 WHERE jsondata LIKE '%' + @SearchFor + '%';