No creo que una búsqueda de texto completo te ayudaría Parece que está buscando cualquier fragmento, incluso términos técnicos como /1/
.
Prueba esto para XML
DECLARE @SearchFor VARCHAR(100)='1';
SELECT *
FROM SettingsData
WHERE xmldata.exist(N'//*[contains(text()[1],sql:variable("@SearchFor"))]')=1;
Comprobará el text()
interno de cualquier nodo si contiene la frase de búsqueda. Pero cualquier valor con un 1
dentro se encuentra (por ejemplo, cualquier número no relacionado que tenga un 1
en algún lugar). Puede buscar text()="1"
y realiza el contains
solo si la longitud de la cadena supera un 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 es, hasta ahora, nada más que una cadena y debe analizarse. Con la versión 2016, Microsoft introdujo la compatibilidad con JSON, pero usted está en la versión 2012. El problema con un LIKE
la búsqueda en una cadena JSON podría ser que encontraría el 1 incluso como parte del nombre de un elemento. El resto es como arriba...
SELECT *
FROM SettingsData
WHERE jsondata LIKE '%' + @SearchFor + '%';