XQuery-Abfragen, die die Reihenfolge berücksichtigen

In relationalen Datenbanken spielt die Reihenfolge keine Rolle. Sie können z. B. keine Anforderung wie etwa "Ersten Kunden aus der Datenbank abrufen" erstellen. Sie können jedoch ein XML-Dokument abfragen und das erste <Customer>-Element abrufen. In diesem Fall wird immer der gleiche Kunde abgerufen.

Dieses Thema stellt Abfragen vor, die auf der Reihenfolge basieren, in der Knoten im Dokument vorhanden sind.

Beispiele:

A. Abrufen von Fertigungsschritten an einem zweiten Arbeitsplatzstandort für ein Produkt

Die folgende Abfrage ruft die Fertigungsschritte für ein bestimmtes Produktmodell an einem zweiten Arbeitsplatzstandort in einer Abfolge von Arbeitsplatzstandorten im Fertigungsprozess ab.

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

Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:

  • Die Ausdrücke in den geschweiften Klammern werden durch das Ergebnis der Auswertung ersetzt. Weitere Informationen finden Sie unter XML-Konstruktion (XQuery).
  • @* ruft alle Attribute des zweiten Arbeitsplatzstandortes ab.
  • Die FLWOR-Iteration (FOR ... RETURN) ruft alle untergeordneten <step>-Elemente des zweiten Arbeitsplatzstandortes ab.
  • Die sql:column()-Funktion (XQuery) enthält den relationalen Wert des XMLs, das erstellt wird.

Dies ist das Ergebnis:

<ManuStep ProdModelID="7" ProductModelName="HL Touring Frame">
  <Location LocationID="20" SetupHours="0.15" 
              MachineHours="2"  LaborHours="1.75" LotSize="1">
  <Steps>
   <Step>Assemble all frame components following blueprint 1299.</Step>
     …
  </Steps>
 </Location>
</ManuStep>  

Die vorherige Abfrage ruft nur die Textknoten ab. Wenn das gesamte <step>-Element zurückgegeben werden soll, entfernen Sie die string()-Funktion aus der Abfrage:

B. Abrufen aller Materialien und Werkzeuge, die am zweiten Arbeitsplatzstandort bei der Fertigung eines Produkts verwendet werden

Die folgende Abfrage ruft die Materialien und Werkzeuge für ein bestimmtes Produktmodell an einem zweiten Arbeitsplatzstandort in der Abfolge von Arbeitsplatzstandorten im Fertigungsprozess ab.

SELECT Instructions.query('
    declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
   <Location>
      { (//AWMI:root/AWMI:Location)[1]/@* }
       <Tools>
         { for $s in (//AWMI:root/AWMI:Location)[1]//AWMI:step//AWMI:tool
           return
              <Tool>
                { string($s) }
              </Tool>
          }
        </Tools>
        <Materials>
            { for $s in (//AWMI:root/AWMI:Location)[1]//AWMI:step//AWMI:material
              return
                 <Material>
                    { string($s) }
                 </Material>
             }
         </Materials>
  </Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7

Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:

  • Die Abfrage erstellt das <Location>-Element und ruft seine Attributwerte aus der Datenbank ab.
  • Sie verwendet zwei FLWOR (for...return)-Iterationen: eine Iteration zum Abrufen der Werkzeuge und eine zweite Iteration zum Abrufen der verwendeten Materialien.

Dies ist das Ergebnis:

<Location LocationID="10" SetupHours=".5" 
          MachineHours="3" LaborHours="2.5" LotSize="100">
  <Tools>
    <Tool>T-85A framing tool</Tool>
    <Tool>Trim Jig TJ-26</Tool>
    <Tool>router with a carbide tip 15</Tool>
    <Tool>Forming Tool FT-15</Tool>
  </Tools>
  <Materials>
    <Material>aluminum sheet MS-2341</Material>
  </Materials>
</Location>

C. Abrufen der ersten beiden Produktfeaturebeschreibungen aus dem Produktkatalog

Die folgende Abfrage ruft die beiden ersten Featurebeschreibungen aus dem <Features>-Element im Produktmodellkatalog für ein bestimmtes Produktmodell ab.

SELECT CatalogDescription.query('
     declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     <ProductModel ProductModelID= "{ data( (/p1:ProductDescription/@ProductModelID)[1] ) }"
                   ProductModelName = "{ data( (/p1:ProductDescription/@ProductModelName)[1] ) }" >
       {
         for $F in /p1:ProductDescription/p1:Features
         return 
           $F/*[position() <= 2] 
       }
     </ProductModel>
      ') as x
FROM Production.ProductModel
where ProductModelID=19

Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:

Die Abfrage erstellt XML, das das <ProductModel>-Element umfasst, das die ProductModelID- und ProductModelName-Attribute enthält.

  • Die Abfrage verwendet eine FOR ... RETURN-Schleife zum Abrufen der Produktmodell-Featurebeschreibungen. Die position()-Funktion wird zum Abrufen der ersten beiden Features verwendet.

Dies ist das Ergebnis:

<ProductModel ProductModelID="19" ProductModelName="Mountain 100">
 <p1:Warranty 
  xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
  <p1:WarrantyPeriod>3 year</p1:WarrantyPeriod>
  <p1:Description>parts and labor</p1:Description>
 </p1:Warranty>
 <p2:Maintenance 
  xmlns:p2="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
  <p2:NoOfYears>10</p2:NoOfYears>
  <p2:Description>maintenance contact available through your dealer 
            or any AdventureWorks retail store.
  </p2:Description>
 </p2:Maintenance>
</ProductModel> 

B. Abrufen der ersten beiden Werkzeuge, die am ersten Arbeitsplatzstandort bei der Fertigung eines Produkts verwendet werden

Die folgende Abfrage gibt die ersten beiden Werkzeuge für ein Produktmodell zurück, die am ersten Arbeitsplatzstandort in der Abfolge von Arbeitsplatzstandorten im Fertigungsprozess verwendet werden. Die Abfrage wird für die Fertigungsanweisungen angegeben, die in der Instructions-Spalte der Production.ProductModel-Tabelle gespeichert sind.

SELECT Instructions.query('
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
   for $Inst in (//AWMI:root/AWMI:Location)[1]
   return 
     <Location>
       { $Inst/@* }
       <Tools>
         { for $s in ($Inst//AWMI:step//AWMI:tool)[position() <= 2]
           return
             <Tool>
               { string($s) }
             </Tool>
         }
       </Tools>
     </Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7

Dies ist das Ergebnis:

<Location LocationID="10" SetupHours=".5" 
            MachineHours="3" LaborHours="2.5" LotSize="100">
  <Tools>
    <Tool>T-85A framing tool</Tool>
    <Tool>Trim Jig TJ-26</Tool>
  </Tools>
</Location> 

B. Abrufen der letzten beiden Fertigungsschritte am ersten Arbeitsplatzstandort für die Fertigung eines bestimmten Produkts

Die Abfrage verwendet die last()-Funktion zum Abrufen der letzten beiden Fertigungsschritte.

SELECT Instructions.query(' 
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
  <LastTwoManuSteps>
   <Last-1Step> 
     { (/AWMI:root/AWMI:Location)[1]/AWMI:step[(last()-1)]/text() }
   </Last-1Step>
   <LastStep> 
     { (/AWMI:root/AWMI:Location)[1]/AWMI:step[last()]/text() }
   </LastStep>
  </LastTwoManuSteps>') as Result
FROM Production.ProductModel
where ProductModelID=7

Dies ist das Ergebnis:

<LastTwoManuSteps>
   <Last-1Step>When finished, inspect the forms for defects per 
               Inspection Specification .</Last-1Step>
   <LastStep>Remove the frames from the tool and place them in the 
             Completed or Rejected bin as appropriate.</LastStep>
</LastTwoManuSteps>

Siehe auch

Konzepte

XML-Datentyp
XML-Konstruktion (XQuery)

Andere Ressourcen

XQuery für den xml-Datentyp

Hilfe und Informationen

Informationsquellen für SQL Server 2005