XQuery-Abfragen unter Einbeziehung von Hierarchien

Die meisten xml-Typspalten 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. Aus den Dokumenten zur Produktionsanweisung werden die Arbeitsplatzstandorte sowie jeweils der erste Fertigungsschritt an diesen Standorten abgerufen.

Für Produktmodell 7 ergibt die Abfrage eine XML-Konstruktion, die das <ManuInstr>-Element einschließt, mit den ProductModelID- und ProductModelName-Attributen und einem oder mehreren untergeordneten Elementen von <Location>.

Jedes <Location>-Element verfügt über einen eigenen Satz von Attributen und über ein untergeordnetes <step>-Element. Dieses untergeordnete <step>-Element ist der erste Fertigungsschritt am jeweiligen Arbeitsplatzstandort.

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 in 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 Konstruieren des <Location>-Elements ruft $wc/@* alle Attribute zu den Arbeitsplatzstandorten ab.
  • Die string()-Funktion gibt den Zeichenfolgenwert aus dem <step>-Element zurück.

Dies ist ein 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

Mit der folgenden Abfrage werden zusätzliche Telefonnummern für einen bestimmten Kundenkontakt abgerufen, indem die gesamte Hierarchie des <telephoneNumber>-Elements durchsucht wird. Da das <telephoneNumber>-Element an einer beliebigen Position innerhalb der Hierarchie auftauchen kann, verwendet die Abfrage zur Suche den descendant-or-self-Operator (//).

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 ausschließlich die Telefonnummern auf der obersten Ebene abzurufen, insbesondere die untergeordneten <telephoneNumber>-Elemente von <AdditionalContactInfo>, wechselt der FOR-Ausdruck in der Abfrage zu

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

Siehe auch

Konzepte

XQuery-Grundlagen
XML-Konstruktion (XQuery)
XML-Datentyp

Hilfe und Informationen

Informationsquellen für SQL Server 2005