sql >> Databasteknik >  >> RDS >> Sqlserver

XPath för att hämta SQL XML-värde

Uppdatera

Min rekommendation skulle vara att strimla XML i relationer och göra sökningar och sammanfogningar på den resulterande relationen, på ett set orienterat sätt, snarare än det procedurmässiga sättet att söka efter specifika noder i XML. Här är en enkel XML-fråga som skär ut noder och attribut av intresse:

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)

Men om du måste använda en XPath som hämtar exakt värdet av intresse:

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)

Om steg-ID och komponent-ID är kolumner, inte variabler, bör du använda sql:column() istället för sql:variabel i XPath-filtren. Se Bindning av relationsdata inuti XML-data .

Och slutligen om allt du behöver är att kontrollera om det finns kan du använda exist( ) XML-metod:

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


  1. MySQL Volleybollställning

  2. Utforska Java Unit Testing med JUnit Test Framework

  3. Vad är det för fel på Cursors?

  4. Hur jämför jag två kolumner i SQL?