Requêtes XQuery impliquant un ordre

Le concept de séquence n'existe pas dans les bases de données relationnelles. Il est, par exemple, impossible de créer une requête telle que « Obtenir le premier client de la base de données ». En revanche, 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

A. 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 par rapport à 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 poste de travail.
  • L'itération FLWOR (FOR ... RETURN) récupère tous les éléments enfants <step> du deuxième poste de travail.
  • La fonction sql:column() (XQuery) contient la valeur relationnelle dans le code XML en cours d'élaboration.

Voici le jeu de résultats 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 préférez récupérer l'ensemble de l'élément <step>, 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 par rapport à la requête précédente :

  • La requête construit l'élément <Location> et récupère la valeur de ses attributs dans 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 jeu de résultats 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 descriptions des deux premiers composants à partir de l'élément <Features> dans le catalogue du modèle 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 par rapport à la requête précédente :

Le corps de la requête construit du code XML qui englobe l'élément <ProductModel> ayant ProductModelID et ProductModelName comme attributs.

  • La requête utilise une boucle FOR ... RETURN pour récupérer les descriptions des composants du modèle de produit. La fonction position() sert à récupérer les deux premiers composants.

Voici le jeu de résultats 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 lancée sur les 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 jeu de résultats 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 jeu de résultats 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

Concepts

Type de données xml
Construction XML (XQuery)

Autres ressources

Requêtes XQuery impliquant le type de données xml

Aide et Informations

Assistance sur SQL Server 2005