Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

XPath pour récupérer la valeur SQL XML

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"]')