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 + '%';