- XQuery sur le type de données xml
- Cas d'utilisation généraux de XQuery
- XQueries impliquant une hiérarchie
-
Tout ce qui se trouve dans le le blog de Michael Rys
Mettre à jour
Ma recommandation serait de déchiqueter le XML en relations et d'effectuer des recherches et des jointures sur la relation résultante, de manière orientée ensemble, plutôt que de manière procédurale consistant à rechercher des nœuds spécifiques dans le XML. Voici une requête XML simple qui décompose les nœuds et les attributs d'intérêt :
select x.value(N'../../../../@stepId', N'int') as StepID
, x.value(N'../../@id', N'int') as ComponentID
, x.value(N'@nom',N'nvarchar(100)') as Nom
, x.value(N'@valeur', N'nvarchar(100)') as Valeur
from @x.nodes(N'/xml/box/components/component/variables/variable') t(x)
Cependant, si vous devez utiliser un XPath qui récupère exactement la valeur qui vous intéresse :
select x.value(N'@valeur', N'nvarchar(100)') as Valeur
from @x.nodes(N'/xml/box[@stepId=sql:variable("@stepID")]/
components/component[@id = sql:variable("@componentID")]/
variables/variable[@nom="Enabled"]') t(x)
Si le stepID et l'ID de composant sont des colonnes et non des variables, vous devez utiliser sql:column() au lieu de sql:variable dans les filtres XPath. Voir Lier des données relationnelles dans des données XML .
Et enfin, si tout ce dont vous avez besoin est de vérifier l'existence, vous pouvez utiliser le exist( ) Méthode XML :
select @x.exist(
N'/xml/box[@stepId=sql:variable("@stepID")]/
components/component[@id = sql:variable("@componentID")]/
variables/variable[@nom="Enabled" and @valeur="Yes"]')