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 Path Expressions (XQuery).For more information, see Path Expressions (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> ruft der zweite Schritt die untergeordneten Elemente des <Summary-Elementknotens> 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. Bei Ausführung anhand der XML-Dokumente für die Herstellungsanweisungen in der Tabelle "Production.ProductModel " gibt der Ausdruck das LocationID
Attribut des <untergeordneten Knotens "Location> " des <Stammelements> zurück.
Beispiele
Die Abfragebeispiele in diesem Thema werden anhand von XML-Typspalten in der AdventureWorks-Datenbank angegeben.
A. Angeben einer child-Achse
Bei einem bestimmten Produktmodell ruft die folgende Abfrage die <untergeordneten Elemente> 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 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::*
, sie fragen 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 dessen Beziehung zum Knotentest finden Sie unter Angeben des Knotentests in einem Thema "Pfadausdrucksschritt ".
Die Elementknoten <c
> und <d
> werden zurückgegeben, wie im folgenden Ergebnis dargestellt:
<c>text2
<d>text3</d>
</c>
<d>text3</d>
Wenn Sie anstelle der untergeordneten Achse eine untergeordnete Oder-Selbst-Achse angeben, /child::a/child::b/descendant-or-self::*
werden der Kontextknoten, das Element <b
>und dessen absteigende Achse 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 untergeordneten Elementknoten des <Features
> untergeordneten 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 ü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 Beschreibung des Produktmodellkatalogs, die in der Spalte "CatalogDescription" der Tabelle "ProductModel" gespeichert ist, weist ein <ProductDescription>
Element auf, das das Attribut und <Features>
das ProductModelID
untergeordnete Element aufweist, wie im folgenden Fragment dargestellt:
<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).For more information, see FLWOR Statement and 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
einzelnen <Feature
> Elemente 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.