Angeben einer Achse in einem Pfadausdrucksschritt
Ein Achsenschritt in einem Pfadausdruck besteht aus den folgenden Komponenten:
Einer Achse
Einem Knotentest
Weitere Informationen finden Sie unter Pfadausdrücke (XQuery).
Die XQuery-Implementierung in SQL Server unterstützt folgende 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. |
self |
Gibt den Kontextknoten selbst zurück. |
descendant-or-self |
Gibt den Kontextknoten und alle nachfolgenden Elemente des Kontextknotens zurück. |
Alle diese Achsen sind vorwärtsgerichtete Achsen, mit Ausnahme der parent-Achse. Die parent-Achse ist eine rückwärtsgerichtete Achse, da sie in der Dokumenthierarchie nach hinten sucht. Beispiel: Der relative Pfadausdruck child::ProductDescription/child::Summary enthält zwei Schritte, von denen jeder eine child-Achse angibt. Der erste Schritt ruft die untergeordneten <ProductDescription>-Elemente des Kontextknotens ab. Der zweite Schritt ruft für jeden <ProductDescription>-Elementknoten die untergeordneten <Summary>-Elementknoten ab.
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 dieser Ausdruck für die XML-Dokumente mit den Fertigungsanweisungen in der Production.ProductModel-Tabelle ausgeführt wird, gibt er das LocationID-Attribut des untergeordneten <Location>-Elementknotens des <root>-Elements zurück.
Beispiele:
Die Abfragebeispiele in diesem Thema werden für die verschiedenen Spalten vom xml-Typ in der AdventureWorks2008R2-Datenbank angegeben. Informationen zu diesen Spalten finden Sie unter Darstellung des xml-Datentyps in der AdventureWorks2008R2-Datenbank.
A. Angeben einer child-Achse
Die folgende Abfrage ruft für ein bestimmtes Produktmodell die untergeordneten <Features>-Elementknoten des <ProductDescription>-Elementknotens aus der in der Production.ProductModel-Tabelle gespeicherten Produktkatalogbeschreibung ab.
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 von Datentyp xml gibt den Pfadausdruck an.
Beide Schritte des Pfadausdrucks geben eine child-Achse und die Knotennamen ProductDescription und Features als Knotentests an. Weitere Informationen zu Knotentests finden Sie unter Angeben eines 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 Variable vom Typ xml 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::*, rufen Sie damit alle nachfolgenden Elemente des <b>-Elementknotens ab.
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 Typ des primären Knotens und dessen Beziehung zum Knotentest finden Sie unter Angeben eines Knotentests in einem Pfadausdrucksschritt.
Wie im folgenden Ergebnis gezeigt, werden die Elementknoten <c> und <d> zurückgegeben:
<c>text2
<d>text3</d>
</c>
<d>text3</d>
Wenn Sie eine descendant-or-self-Achse statt einer descendant-Achse angeben, gibt /child::a/child::b/descendant-or-self::* den Kontextknoten, das Element <b>, und seine Nachfolger zurück:
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 AdventureWorks2008R2-Datenbank ruft alle nachfolgenden Elementknoten des untergeordneten <Features>-Elements des <ProductDescription>-Elements ab:
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 parent-Achse
Die folgende Abfrage gibt das untergeordnete <Summary>-Element des <ProductDescription>-Elements aus dem Produktkatalog-XML-Dokument zurück, das in der Production.ProductModel-Tabelle gespeichert ist:
In diesem Beispiel wird die parent-Achse verwendet, um zu dem übergeordneten Element von <Feature> zurückzukehren und das untergeordnete <Summary>-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 in der CatalogDescription-Spalte der ProductModel-Tabelle gespeicherte Produktmodell-Katalogbeschreibung besitzt ein <ProductDescription>-Element mit einem ProductModelID-Attribut und einem untergeordneten <Features>-Element, wie im folgenden Codefragment 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 die ProductModelID für 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 Adventure Works 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.