Teilen über


XQuery-Abfragen, die die Reihenfolge berücksichtigen

Gilt für:SQL Server

In relationalen Datenbanken spielt die Reihenfolge keine Rolle. Beispielsweise können Sie keine Anforderung wie "Abrufen des ersten Kunden aus der Datenbank" stellen. 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 Herstellungsschritten am 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 Arbeitsplatzstandorts ab.

  • Die FLWOR-Iteration (FOR ... RETURN) ruft alle <step> untergeordneten Elemente des zweiten Arbeitsplatzstandorts ab.

  • Die sql:column()-Funktion (XQuery) enthält den relationalen Wert im XML-Code, der gerade 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 stattdessen das gesamte <step> Element zurückgegeben werden soll, entfernen Sie die String() -Funktion aus der Abfrage:

B. Suchen aller Materialen und Werkzeuge, die am zweiten Arbeitsplatzstandort zur 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 <Loca-Elementtion> 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 Produktfunktionsbeschreibungen aus dem Produktkatalog

Für ein bestimmtes Produktmodell ruft die Abfrage die ersten beiden Featurebeschreibungen aus dem <Features> Element im Produktmodellkatalog 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:

Der Abfragetext erstellt XML, das das Element mit den <ProductModel> Attributen ProductModelID und ProductModelName enthält.

  • Die Abfrage verwendet ein FOR ... RETURN-Schleife, um die Beschreibungen der Produktmodellfeatures abzurufen. Die Funktion position() wird verwendet, um die ersten beiden Features abzurufen.

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>   

D: Suchen der ersten beiden Werkzeuge, die am ersten Arbeitsplatzstandort zur Herstellung des 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 Spalte Anweisungen der Tabelle Production.ProductModel 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>   

E. Suchen der letzten zwei Herstellungsschritte am ersten Arbeitsplatzstandort zur Fertigung eines bestimmten Produkts

Die Abfrage verwendet die Last() -Funktion, um die letzten beiden Herstellungsschritte abzurufen.

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>  

Weitere Informationen

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