Delen via


XQueries met order

van toepassing op:SQL Server-

Relationele databases hebben geen concept van reeks. U kunt bijvoorbeeld geen aanvraag indienen, zoals 'De eerste klant ophalen uit de database'. U kunt echter een XML-document opvragen en het eerste <Customer>-element ophalen. Vervolgens haalt u altijd dezelfde klant op.

Dit onderwerp illustreert query's op basis van de volgorde waarin knooppunten in het document worden weergegeven.

Voorbeelden

Een. Productiestappen ophalen op de tweede werkcentrumlocatie voor een product

Voor een specifiek productmodel haalt de volgende query de productiestappen op de tweede werkcentrumlocatie op in een reeks werkcentrumlocaties in het productieproces.

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  

Let op het volgende uit de vorige query:

  • De expressies in de accolades worden vervangen door het resultaat van de evaluatie. Zie XQuery-(XML Construction) voor meer informatie.

  • @* haalt alle kenmerken van de tweede locatie van het werkcentrum op.

  • De FLWOR iteratie (FOR ... RETURN) haalt alle <step> onderliggende elementen van de tweede werkcentrumlocatie op.

  • De functie sql:column() (XQuery) bevat de relationele waarde in de XML die wordt samengesteld.

Dit is het resultaat:

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

Met de vorige query worden alleen de tekstknooppunten opgehaald. Als u het hele <step> element wilt retourneren, verwijdert u de tekenreeks() functie uit de query:

B. Vind alle materiaal en hulpmiddelen die worden gebruikt op de tweede werkcentrumlocatie in de productie van een product

Voor een specifiek productmodel haalt de volgende query de hulpprogramma's en materialen op die worden gebruikt op de tweede werkcentrumlocatie in de volgorde van werkcentrumlocaties in het productieproces.

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  

Let op het volgende uit de vorige query:

  • De query bouwt het element <Location> en haalt de bijbehorende kenmerkwaarden op uit de database.

  • Het gebruikt twee FLWOR (voor... return) iteraties: één om hulpprogramma's op te halen en één om het gebruikte materiaal op te halen.

Dit is het resultaat:

<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. De eerste twee productfunctiesbeschrijvingen ophalen uit de productcatalogus

Voor een specifiek productmodel haalt de query de eerste twee functiebeschrijvingen op uit het <Features> element in de productmodelcatalogus.

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  

Let op het volgende uit de vorige query:

De hoofdtekst van de query bouwt XML met het <ProductModel>-element met de kenmerken ProductModelID en ProductModelName.

  • De query maakt gebruik van een FOR ... Return-lus om de productmodelfunctiebeschrijvingen op te halen. De functie position() wordt gebruikt om de eerste twee functies op te halen.

Dit is het resultaat:

<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. De eerste twee hulpprogramma's zoeken die worden gebruikt op de eerste werkcentrumlocatie in het productieproces van het product

Voor een productmodel retourneert deze query de eerste twee hulpprogramma's die worden gebruikt op de eerste werkcentrumlocatie in de volgorde van werkcentrumlocaties in het productieproces. De query wordt opgegeven op basis van de productie-instructies die zijn opgeslagen in de kolom Instructies van de tabel Production.ProductModel.

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  

Dit is het resultaat:

<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. Zoek de laatste twee productiestappen op de eerste locatie van het werkcentrum in de productie van een specifiek product

De query maakt gebruik van de functie last() om de laatste twee productiestappen op te halen.

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  

Dit is het resultaat:

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

Zie ook

XML-gegevens (SQL Server)
XQuery Language Reference (SQL Server)
XML-constructie (XQuery)