Je ne pense pas qu'une recherche plein texte vous aiderait. Il semble que vous recherchiez n'importe quel fragment, même des termes techniques tels que /1/
.
Essayez ceci pour XML
DECLARE @SearchFor VARCHAR(100)='1';
SELECT *
FROM SettingsData
WHERE xmldata.exist(N'//*[contains(text()[1],sql:variable("@SearchFor"))]')=1;
Il vérifiera le text()
interne de n'importe quel nœud s'il contient la phrase de recherche. Mais toute valeur avec un 1
à l'intérieur est trouvé (par exemple, tout nombre sans rapport qui a un 1
quelque part.) Vous pouvez rechercher text()="1"
et effectuer le contains
uniquement si la longueur de la chaîne dépasse un certain minimum.
Quelque chose comme
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 n'est - jusqu'à présent - rien de plus qu'une chaîne et doit être analysé. Avec la v2016, Microsoft a introduit le support JSON, mais vous êtes sur la v2012. Le problème avec un LIKE
rechercher sur une chaîne JSON pourrait être que vous trouveriez le 1 même en tant que partie du nom d'un élément. Le reste est comme ci-dessus...
SELECT *
FROM SettingsData
WHERE jsondata LIKE '%' + @SearchFor + '%';