XQuery-Abfragen unter Einbeziehung von Hierarchien

Gilt für:SQL Server

Die meisten Xml-Typspalten in der AdventureWorks-Datenbank sind semistrukturierte 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

Für Produktmodell 7 erstellt die Abfrage XML, die das -Element mit den <ManuInstr> Attributen ProductModelID und ProductModelName sowie mindestens einem <Location> untergeordneten Element enthält.

Jedes <Location> Element verfügt über einen eigenen Satz von Attributen und ein <step> untergeordnetes Element. Dieses <step> untergeordnete Element ist der erste Fertigungsschritt am 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 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.

  • Sql:column() wird verwendet, um einen relationalen Wert in den XML-Code einzuschließen, der erstellt wird.

  • Beim Erstellen des <Location> Elements ruft $wc/@* alle Attribute des Arbeitsplatzstandorts 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

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 Nachfolger und den Selbstoperator (//) 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 <telephoneNumber> untergeordneten Elemente von <AdditionalContactInfo>, ändert sich der FOR-Ausdruck in der Abfrage in

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

Siehe auch

XQuery-Grundlagen
XML Construction (XQuery) (XML-Konstruktion (XQuery))
XML-Daten (SQL Server)