Freigeben über


XQuery-Abfragen unter Einbeziehung von Hierarchien

Die meisten Spalten vom Typ xml in der AdventureWorks-Datenbank sind halbstrukturierte Dokumente. Deshalb können die in jeder Zeile gespeicherten Dokumente unterschiedlich aussehen. Die in diesem Thema gezeigten Abfragebeispiele veranschaulichen, wie Informationen aus diesen unterschiedlichen Dokumenten extrahiert werden können.

Beispiele

A.Abrufen von Arbeitsplatzstandorten mit dem zugehörigen ersten Fertigungsschritt aus Dokumenten mit Produktionsanweisungen

Die Abfrage erstellt XML mit dem <ManuInstr>-Element, dem ProductModelID-Attribut und dem ProductModelName-Attribut sowie einem oder mehreren untergeordneten <Location>-Elementen für das Produktmodell 7.

Jedes <Location>-Element verfügt über einen eigenen Satz von Attributen sowie ein untergeordnetes <step>-Element. Das untergeordnete <step>-Element stellt den ersten Fertigungsschritt am Arbeitsplatzstandort dar.

SELECT Instructions.query('
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
   <ManuInstr  ProdModelID = "{sql:column("Production.ProductModel.ProductModelID") }" 
                ProductModelName = "{ sql:column("Production.ProductModel.Name") }" >
            { 
              for $wc in //AWMI:root/AWMI:Location
              return
                <Location>
                 {$wc/@* }
                 <step1> { string( ($wc//AWMI:step)[1] ) } </step1>
                </Location>
            }
          </ManuInstr>
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7

Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:

  • Das namespace-Schlüsselwort im XQuery-Prolog definiert ein Namespacepräfix. Dieses Präfix wirt später im Body-Teil der Abfrage verwendet.

  • Die Tokens zum Kontextwechsel, {) und (}, bewirken das Wechseln der Abfrage von der XML-Konstruktion zur Abfrageauswertung.

  • Die sql:column()-Anweisung wird verwendet, um einen relationalen Wert in den konstruierten XML-Code einzuschließen.

  • Beim Erstellen des <Location>-Elements werden alle Attribute für den Arbeitsplatzstandort von $wc/@* abgerufen.

  • Die string()-Funktion gibt den Zeichenfolgenwert aus dem <step>-Element zurück.

Dies ist das Teilergebnis:

<ManuInstr ProdModelID="7" ProductModelName="HL Touring Frame">
   <Location LocationID="10" SetupHours="0.5" 
            MachineHours="3" LaborHours="2.5" LotSize="100">
     <step1>Insert aluminum sheet MS-2341 into the T-85A 
             framing tool.</step1>
   </Location>
   <Location LocationID="20" SetupHours="0.15" 
            MachineHours="2" LaborHours="1.75" LotSize="1">
      <step1>Assemble all frame components following 
             blueprint 1299.</step1>
   </Location>
...
</ManuInstr> 

B.Suchen aller Telefonnummern in der AdditionalContactInfo-Spalte

Die folgende Abfrage ruft zusätzliche Telefonnummern für einen bestimmten Kundenkontakt ab, indem die gesamte Hierarchie nach dem <telephoneNumber>-Element durchsucht wird. Da das <telephoneNumber>-Element an einer beliebigen Stelle in der Hierarchie angezeigt werden kann, verwendet die Abfrage den descendant- und den self-Operator (//) in der Suche.

SELECT AdditionalContactInfo.query('
 declare namespace ci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
 declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
for $ph in /ci:AdditionalContactInfo//act:telephoneNumber
   return
      $ph/act:number
') as x
FROM  Person.Contact
WHERE ContactID = 1

Dies ist das Ergebnis:

<act:number 
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
  111-111-1111
</act:number>
<act:number 
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
  112-111-1111
</act:number>

Um nur die Telefonnummern der obersten Ebene abzurufen, insbesondere die untergeordneten <telephoneNumber>-Elemente von <AdditionalContactInfo>, wird der FOR-Ausdruck in der Abfrage wie folgt geändert:

for $ph in /ci:AdditionalContactInfo/act:telephoneNumber.

Siehe auch

Konzepte

XML-Konstruktion (XQuery)

XML-Daten (SQL Server)

Andere Ressourcen

XQuery-Grundlagen