Freigeben über


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

Bei Produktmodell 7 erstellt die Abfrage XML, die das <>ManuInstrElement enthält, mit den Attributen "ProductModelID" und "ProductModelName" und einem oder <Location> mehreren untergeordneten Elementen.

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 Arbeitsplatz.

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() 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 Arbeitscenterstandorts ab.

  • Die Zeichenfolgenfunktion 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 für das <telephoneNumber> Element durchsucht wird. Da das <telephoneNumber> Element an einer beliebigen Stelle in der Hierarchie angezeigt werden kann, verwendet die Abfrage den absteigenden und selbstoperanten (//) 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)