Utilisez une instruction LIKE sur le type de données XML SQL Server
Si vous avez un champ varchar, vous pouvez facilement faire SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'
pour voir si cette colonne contient une certaine chaîne.
Comment faites-vous cela pour le type XML?
J'ai ce qui suit qui renvoie uniquement les lignes qui ont un nœud' Text ' mais j'ai besoin de rechercher dans ce nœud
select * from WebPageContent where data.exist('/PageContent/Text') = 1
4 réponses
Vous devriez pouvoir le faire assez facilement:
SELECT *
FROM WebPageContent
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'
La méthode .value
vous donne la valeur réelle, et vous pouvez la définir pour être renvoyée en tant que VARCHAR (), que vous pouvez ensuite vérifier avec une instruction LIKE.
Attention, ça ne va pas être terriblement rapide. Donc, si vous avez certains champs dans votre XML que vous devez inspecter beaucoup, vous pouvez:
- créez une fonction stockée qui obtient 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 fait une colonne persistante
Avec cela, vous "extrayez" une certaine partie du XML dans un champ calculé, le faites persister, et ensuite vous pouvez rechercher très efficacement dessus (heck: vous pouvez même indexer ce champ!).
Marc
Une autre option 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'aime cette solution car elle est propre, facile à retenir, difficile de désordre, et peut être utilisé comme une partie d'une clause where.
EDIT: comme Cliff le mentionne, vous pouvez utiliser:
...nvarchar s'il y a des caractères qui ne sont pas convertis en varchar
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 une autre sélection comme ceci:
SELECT * FROM
(SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x
WHERE [XMLDataString] like '%Test%'
C'est ce que je vais utiliser basé sur la réponse 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