Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

XPath zum Abrufen des SQL-XML-Werts

Aktualisieren

Meine Empfehlung wäre, das XML in Relationen zu zerkleinern und Suchen und Joins auf der resultierenden Relation auf mengenorientierte Weise durchzuführen, anstatt auf prozedurale Weise nach bestimmten Knoten im XML zu suchen. Hier ist eine einfache XML-Abfrage, die die Knoten und Attribute von Interesse herausschreddert:

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)

Wenn Sie jedoch einen XPath verwenden müssen, der genau den interessierenden Wert abruft:

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)

Wenn die stepID und die Komponenten-ID Spalten und keine Variablen sind, sollten Sie sql:column() anstelle von sql:variable in den XPath-Filtern verwenden. Siehe Bindung relationaler Daten in XML-Daten .

Und schließlich, wenn Sie nur auf Existenz prüfen müssen, können Sie den 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"]')