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
59
demandé sur Cœur 2009-12-02 16:40:49

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

57
répondu marc_s 2009-12-02 13:45:37

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

37
répondu Squazz 2017-08-07 17:54:24

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%'
10
répondu Carl Onager 2014-06-19 07:16:51

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

0
répondu Jon 2009-12-02 14:40:00