102 votes

Utiliser une déclaration sur SQL Server Type de données XML

Si vous avez un champ de type varchar, vous pouvez facilement le faire SELECT * from TABLE where COLUMNA LIKE '%Test%' pour voir si la colonne contient une chaîne de caractère.

Comment faites-vous pour Type XML?

J'ai le texte suivant qui renvoie uniquement les lignes qui a un 'Texte' nœud, mais j'ai besoin de recherche dans le nœud

select * from WebPageContent where data.exist('/PageContent/Text') = 1

75voto

marc_s Points 321990

Vous devriez être en mesure de le faire assez facilement:

SELECT * 
FROM WebPageContent 
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'

L' .value vous donne la méthode de la valeur réelle, et vous pouvez choisir d'être renvoyé comme un VARCHAR(), que vous pouvez ensuite vérifier avec une déclaration.

Rappelez-vous, ce n'est pas d'être terriblement vite. Donc si vous avez certains champs dans votre XML que vous avez besoin pour effectuer l'inspection d'un lot, vous pouvez:

  • créer une fonction stockée qui obtient le XML et retourne la valeur que vous recherchez comme un VARCHAR()
  • définir un nouveau champ calculé sur votre table qui appelle cette fonction, et d'en faire une PERSISTÉ colonne

Avec cela, vous serait essentiellement "extrait" d'une certaine partie des données XML dans un champ calculé, faire de il a persisté, et puis vous pouvez rechercher de manière très efficace (du diable: vous pouvez même INDICE de champ!).

Marc

12voto

Clara Onager Points 1623

Une autre option est de rechercher le XML comme une chaîne de caractères en le convertissant en une chaîne de caractères, puis en utilisant COMME. Cependant, comme une colonne calculée ne peut pas faire partie d'une clause where vous devez envelopper dans un autre SÉLECTIONNER comme ceci:

SELECT * FROM
    (SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x
WHERE [XMLDataString] like '%Test%'

0voto

Jon Points 9367

C'est ce que je vais utiliser en fonction de marc_s réponse:

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

De retour d'une sous-chaîne sur la recherche où les critères de recherche existe

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X