Requêtes XQuery impliquant un ordre

S’applique à :SQL Server

Le concept de séquence n'existe pas dans les bases de données relationnelles. Par exemple, vous ne pouvez pas effectuer une requête telle que « Obtenir le premier client à partir de la base de données ». Toutefois, vous pouvez interroger un document XML et récupérer le premier <élément Customer> . Vous récupérez alors toujours le même client.

Cette rubrique présente les requêtes s'appuyant sur l'ordre dans lequel les nœuds apparaissent dans le document.

Exemples

R. Récupération des étapes de fabrication sur le deuxième poste de travail pour un produit

Pour un modèle de produit spécifique, la requête suivante récupère les étapes de fabrication sur le deuxième poste de travail dans l'ordre des postes de travail que comprend le processus de fabrication.

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  

Notez les points suivants dans la requête précédente :

  • Les expressions entre accolades sont remplacées par le résultat de son évaluation. Pour plus d’informations, consultez Construction XML (XQuery).

  • @* récupère tous les attributs du deuxième emplacement du centre de travail.

  • Itération FLWOR (FOR ... RETURN) récupère tous les <step> éléments enfants du deuxième emplacement du centre de travail.

  • La fonction sql:column() (XQuery) inclut la valeur relationnelle dans le code XML en cours de construction.

Voici le résultat obtenu :

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

La requête précédente récupère uniquement les nœuds de texte. Si vous souhaitez que l’élément entier <step> soit retourné à la place, supprimez la fonction string() de la requête :

B. Recherche des matières et outils utilisés sur le deuxième poste de travail au cours de la fabrication d'un produit

Pour un modèle de produit spécifique, la requête suivante récupère les outils et les matières utilisés sur le deuxième poste de travail dans l'ordre des postes de travail que comprend le processus de fabrication.

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  

Notez les points suivants dans la requête précédente :

  • La requête construit l’élément <Location> et récupère ses valeurs d’attribut à partir de la base de données.

  • Elle utilise deux itérations FLWOR (for...return) : la première pour récupérer les outils et la deuxième pour récupérer les matières.

Voici le résultat obtenu :

<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. Récupération des descriptions des deux premiers composants d'un produit à partir du catalogue du produit

Pour un modèle de produit spécifique, la requête récupère les deux premières descriptions de fonctionnalités à partir de l’élément <Features> dans le catalogue de modèles de produit.

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  

Notez les points suivants dans la requête précédente :

Le corps de la requête construit du code XML qui inclut l’élément <ProductModel> qui a les attributs ProductModelID et ProductModelName.

  • La requête utilise un FOR ... Boucle RETURN pour récupérer les descriptions des fonctionnalités du modèle de produit. La fonction position() est utilisée pour récupérer les deux premières fonctionnalités.

Voici le résultat obtenu :

<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. Recherche des deux premiers outils utilisés sur le premier poste de travail du processus de fabrication du produit

Pour un modèle de produit spécifique, la requête suivante récupère les deux premiers outils utilisés sur le premier poste de travail dans l'ordre des postes de travail que comprend le processus de fabrication. La requête est spécifiée par rapport aux instructions de fabrication stockées dans la colonne Instructions de la table 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  

Voici le résultat obtenu :

<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. Recherche des deux dernières étapes de fabrication sur le premier poste de travail au cours de la fabrication d'un produit spécifique

La requête utilise la fonction last() pour récupérer les deux dernières étapes de fabrication.

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  

Voici le résultat obtenu :

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

Voir aussi

Données XML (SQL Server)
Références relatives au langage Xquery (SQL Server)
Construction XML (XQuery)