Pfadausdrücke – Angeben der Achse
Gilt für:SQL Server
Ein Achsenschritt in einem Pfadausdruck besteht aus den folgenden Komponenten:
Einer Achse
Ein Knotentest
Weitere Informationen finden Sie unter Pfadausdrücke (XQuery).
Die XQuery-Implementierung in SQL Server unterstützt die folgenden Achsenschritte:
Achse | BESCHREIBUNG |
---|---|
child | Gibt die untergeordneten Elemente des Kontextknotens zurück. |
descendant | Gibt alle nachfolgenden Elemente des Kontextknotens zurück. |
parent | Gibt das übergeordnete Element des Kontextknotens zurück. |
attribute | Gibt die Attribute des Kontextknotens zurück. |
Selbst | Gibt den Kontextknoten selbst zurück. |
descendant-or-self | Gibt den Kontextknoten und alle nachfolgenden Elemente des Kontextknotens zurück. |
Alle diese Achsen mit Ausnahme der übergeordneten Achse sind Vorwärtsachsen. Die übergeordnete Achse ist eine umgekehrte Achse, da sie in der Dokumenthierarchie rückwärts sucht. Beispiel: Der relative Pfadausdruck child::ProductDescription/child::Summary
enthält zwei Schritte, von denen jeder eine child
-Achse angibt. Im ersten Schritt werden die <untergeordneten Elemente des ProductDescription-Elements> des Kontextknotens abgerufen. Für jeden <ProductDescription-Elementknoten> wird im zweiten Schritt der untergeordnete Knoten des <Summary-Elements> abgerufen.
Der relative Pfadausdruck child::root/child::Location/attribute::LocationID
besitzt drei Schritte. Die ersten beiden Schritte geben jeweils eine child
-Achse und der dritte die attribute
-Achse an. Wenn der Ausdruck für die XML-Dokumente der Produktionsanweisungen in der Tabelle Production.ProductModel ausgeführt wird, gibt der Ausdruck das LocationID
Attribut des <untergeordneten Knotens> location des <Stammelements> zurück.
Beispiele
Die Abfragebeispiele in diesem Thema werden für Xml-Typspalten in der AdventureWorks-Datenbank angegeben.
A. Angeben einer child-Achse
Für ein bestimmtes Produktmodell ruft die folgende Abfrage die untergeordneten Elemente des <Elementknotens Features> des <ProductDescription-Elementknotens> aus der produktkatalogbeschreibung ab, die in der Production.ProductModel
Tabelle gespeichert ist.
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/child::PD:ProductDescription/child::PD:Features')
FROM Production.ProductModel
WHERE ProductModelID=19
Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:
Die
query()
-Methode des xml-Datentyps gibt den Pfadausdruck an.Beide Schritte des Pfadausdrucks geben eine
child
-Achse und die KnotennamenProductDescription
undFeatures
als Knotentests an. Informationen zu Knotentests finden Sie unter Angeben des Knotentests in einem Pfadausdrucksschritt.
B. Angeben von descendant- und descendant-or-self-Achsen
In diesem Beispiel werden descendant- und descendant-or-self-Achsen verwendet. Die Abfrage in diesem Beispiel wird für eine Xml-Typvariable angegeben. Die XML-Instanz wird hier zur Veranschaulichung der Unterschiede in den generierten Ergebnissen vereinfacht dargestellt.
declare @x xml
set @x='
<a>
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
</a>'
declare @y xml
set @y = @x.query('
/child::a/child::b
')
select @y
Im folgenden Ergebnis gibt der Ausdruck einen untergeordneten Elementknoten <b>
eines Elementknotens <a>
zurück.
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
Wenn Sie in diesem Ausdruck eine descendant-Achse für den Pfadausdruck angeben,
/child::a/child::b/descendant::*
, fragen Sie nach allen Nachfolgern des <b
> Elementknotens.
Das Sternchen (*) im Knotentest stellt den Knotennamen als Knotentest dar. Folglich bestimmt der Typ des Primärknotens der descendant-Achse (der Elementknoten) den Typ der zurückgegebenen Knoten, d. h. in diesem Fall, dass der Ausdruck alle Elementknoten zurückgibt. Es werden keine Textknoten zurückgegeben. Weitere Informationen zum primären Knotentyp und seiner Beziehung zum Knotentest finden Sie im Thema Angeben des Knotentests in einem Pfadausdrucksschritt .
Die Elementknoten <c
> und <d
> werden zurückgegeben, wie im folgenden Ergebnis gezeigt:
<c>text2
<d>text3</d>
</c>
<d>text3</d>
Wenn Sie anstelle der Nachkommaachse eine Nachfolger- oder Selbstachse angeben, /child::a/child::b/descendant-or-self::*
werden der Kontextknoten, das Element <b
>und dessen Nachfolger zurückgegeben.
Dies ist das Ergebnis:
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
<c>text2
<d>text3</d>
</c>
<d>text3</d>
Die folgende Beispielabfrage für die AdventureWorks-Datenbank ruft alle Nachfolgerelementknoten des <Features
> untergeordneten Elements des Elements ab:<ProductDescription
>
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/child::PD:ProductDescription/child::PD:Features/descendant::*
')
FROM Production.ProductModel
WHERE ProductModelID=19
C. Angeben einer übergeordneten Achse
Die folgende Abfrage gibt das <Summary
> untergeordnete Element des><ProductDescription
Elements im XML-Dokument des Produktkatalogs zurück, das in der Production.ProductModel
Tabelle gespeichert ist.
In diesem Beispiel wird die übergeordnete Achse verwendet, um zum übergeordneten Element des <Feature
> Elements zurückzukehren und das <Summary
> untergeordnete Element des <ProductDescription
> Elements abzurufen.
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/child::PD:ProductDescription/child::PD:Features/parent::PD:ProductDescription/child::PD:Summary
')
FROM Production.ProductModel
WHERE ProductModelID=19
In dieser Beispielabfrage verwendet der Pfadausdruck die parent
-Achse. Sie können den Ausdruck auch ohne die parent-Achse schreiben, wie im Folgenden gezeigt:
/child::PD:ProductDescription[child::PD:Features]/child::PD:Summary
Ein nützlicheres Beispiel für die parent-Achse wird im folgenden Beispiel bereitgestellt.
Jede Produktmodellkatalogbeschreibung, die in der CatalogDescription-Spalte der ProductModel-Tabelle gespeichert ist, verfügt über ein <ProductDescription>
Element, das das Attribut und <Features>
das ProductModelID
untergeordnete Element enthält, wie im folgenden Fragment gezeigt:
<ProductDescription ProductModelID="..." >
...
<Features>
<Feature1>...</Feature1>
<Feature2>...</Feature2>
...
</ProductDescription>
Die Abfrage legt in der FLWOR-Anweisung eine Iteratorvariable, $f
, fest, damit die untergeordneten Elemente des <Features>
-Element zurückgegeben werden. Weitere Informationen finden Sie unter FLWOR-Anweisung und Iteration (XQuery). Für jedes Funktions-Element konstruiert die return
-Klausel ein XML-Dokument in der folgenden Form:
<Feature ProductModelID="...">...</Feature>
<Feature ProductModelID="...">...</Feature>
Um für ProductModelID
jedes <Feature
> Element hinzuzufügen, wird die parent
Achse angegeben:
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";
for $f in /child::PD:ProductDescription/child::PD:Features/child::*
return
<Feature
ProductModelID="{ ($f/parent::PD:Features/parent::PD:ProductDescription/attribute::ProductModelID)[1]}" >
{ $f }
</Feature>
')
FROM Production.ProductModel
WHERE ProductModelID=19
Dies ist das Teilergebnis:
<Feature ProductModelID="19">
<wm:Warranty
xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>
<wm:Description>parts and labor</wm:Description>
</wm:Warranty>
</Feature>
<Feature ProductModelID="19">
<wm:Maintenance
xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<wm:NoOfYears>10 years</wm:NoOfYears>
<wm:Description>maintenance contract available through your dealer
or any AdventureWorks retail store.</wm:Description>
</wm:Maintenance>
</Feature>
<Feature ProductModelID="19">
<p1:wheel
xmlns:p1="https://www.adventure-works.com/schemas/OtherFeatures">
High performance wheels.
</p1:wheel>
</Feature>
Beachten Sie, dass dem Pfadausdruck das Prädikat [1]
hinzugefügt wird, um sicherzustellen, dass ein Singleton-Wert zurückgegeben wird.