sql >> Database >  >> RDS >> Sqlserver

XPath om SQL XML-waarde op te halen

Bijwerken

Mijn aanbeveling zou zijn om de XML te versnipperen in relaties en zoekopdrachten en joins uit te voeren op de resulterende relatie, op een set-georiënteerde manier, in plaats van op de procedurele manier van het zoeken naar specifieke knooppunten in de XML. Hier is een eenvoudige XML-query die de knooppunten en kenmerken van belang vernietigt:

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)

Als u echter een XPath moet gebruiken die precies de gewenste waarde ophaalt:

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)

Als de stepID en component-ID kolommen zijn en geen variabelen, moet u sql:column() gebruiken in plaats van sql:variable in de XPath-filters. Zie Binding relationele gegevens in XML-gegevens .

En tot slot, als alles wat je nodig hebt om te controleren op bestaan ​​is, kun je de exist( ) XML-methode:

select @x.exist(
  N'/xml/box[@stepId=sql:variable("@stepID")]/
    components/component[@id = sql:variable("@componentID")]/
      variables/variable[@nom="Enabled" and @valeur="Yes"]') 


  1. SQL Server - gebrek aan NATURAL JOIN / x JOIN y USING(field)

  2. Hoe Checkbox Status aangevinkt of niet aangevinkt te maken op basis van databasewaarden?

  3. SELECT-query met letterlijke tekens (dubbele punt, puntkomma) in Oracle

  4. Bug in PostgreSQL-vergrendelingsmechanisme of verkeerd begrip van het mechanisme