Vous devriez pouvoir le faire assez facilement:
SELECT *
FROM WebPageContent
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'
La .value
méthode vous donne la valeur réelle, et vous pouvez la définir pour qu'elle soit renvoyée comme un VARCHAR (), que vous pouvez ensuite vérifier avec une instruction LIKE.
Attention, cela ne va pas être très rapide. Donc, si vous avez certains champs dans votre XML que vous devez inspecter beaucoup, vous pouvez:
- créer une fonction stockée qui récupère le XML et renvoie la valeur que vous recherchez en tant que VARCHAR ()
- définir un nouveau champ calculé sur votre table qui appelle cette fonction, et en faire une colonne PERSISTÉE
Avec cela, vous "extrairez" fondamentalement une certaine partie du XML dans un champ calculé, le rendriez persistant, et vous pourrez alors rechercher très efficacement dessus (diable: vous pouvez même INDEXER ce champ!).
Marc
Une autre option encore consiste à convertir le XML en nvarchar, puis à rechercher la chaîne donnée comme si le XML était un champ nvarchar.
SELECT * FROM Table WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%'
J'adore cette solution car elle est propre, facile à retenir, difficile à gâcher et peut être utilisée dans le cadre d'une clause where.
EDIT: Comme Cliff le mentionne, vous pouvez utiliser:
la source
Une autre option consiste à rechercher le XML sous forme de chaîne en le convertissant en chaîne, puis en utilisant LIKE. Cependant, comme une colonne calculée ne peut pas faire partie d'une clause WHERE, vous devez l'envelopper dans un autre SELECT comme ceci:
SELECT * FROM (SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x WHERE [XMLDataString] like '%Test%'
la source
Voici ce que je vais utiliser en fonction de la réponse de marc_s:
SELECT SUBSTRING(DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)'),PATINDEX('%NORTH%',DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')) - 20,999) FROM WEBPAGECONTENT WHERE COALESCE(PATINDEX('%NORTH%',DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')),0) > 0
Renvoie une sous-chaîne sur la recherche où les critères de recherche existent
la source