Requêtes XQuery impliquant une hiérarchie
S’applique à :SQL Server
La plupart des colonnes de type xml dans la base de données AdventureWorks sont des documents semi-structurés. Par conséquent, les documents stockés dans chaque ligne peuvent avoir un aspect différent. Les exemples de requêtes fournis dans cette rubrique montrent comment extraire des informations de ces divers documents.
Exemples
R. Extraction, à partir des instructions de fabrication, des postes de travail ainsi que de la première étape de fabrication réalisée sur ces différents postes
Pour le modèle de produit 7, la requête construit du code XML qui inclut l’élément <ManuInstr
> , avec des attributs ProductModelID et ProductModelName , ainsi qu’un ou plusieurs <Location
> éléments enfants.
Chaque <Location
> élément a son propre jeu d’attributs et un <step
> élément enfant. Cet <step
> élément enfant est la première étape de fabrication à l’emplacement du centre de travail.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
\<ManuInstr ProdModelID = "{sql:column("Production.ProductModel.ProductModelID") }"
ProductModelName = "{ sql:column("Production.ProductModel.Name") }" >
{
for $wc in //AWMI:root/AWMI:Location
return
<Location>
{$wc/@* }
<step1> { string( ($wc//AWMI:step)[1] ) } </step1>
</Location>
}
</ManuInstr>
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7
Notez les points suivants dans la requête précédente :
Le mot clé namespace dans le prolog XQuery définit un préfixe d’espace de noms. Ce préfixe est utilisé ultérieurement dans le corps de la requête.
Les jetons de basculement de contexte, {) et (}, sont utilisés pour faire passer la requête de la construction XML à sa propre évaluation.
Sql :column() est utilisé pour inclure une valeur relationnelle dans le code XML en cours de construction.
Lors de la construction de l’élément <
Location
> , $wc/@* récupère tous les attributs d’emplacement du centre de travail.La fonction string() retourne la valeur de chaîne de l’élément <
step
> .
Voici un extrait du résultat :
<ManuInstr ProdModelID="7" ProductModelName="HL Touring Frame">
<Location LocationID="10" SetupHours="0.5"
MachineHours="3" LaborHours="2.5" LotSize="100">
<step1>Insert aluminum sheet MS-2341 into the T-85A
framing tool.</step1>
</Location>
<Location LocationID="20" SetupHours="0.15"
MachineHours="2" LaborHours="1.75" LotSize="1">
<step1>Assemble all frame components following
blueprint 1299.</step1>
</Location>
...
</ManuInstr>
B. Recherche de tous les numéros de téléphone de la colonne AdditionalContactInfo
La requête suivante récupère des numéros de téléphone supplémentaires pour un contact client spécifique en recherchant l’élément dans toute la <telephoneNumber
> hiérarchie. Étant donné que l’élément <telephoneNumber
> peut apparaître n’importe où dans la hiérarchie, la requête utilise l’opérateur descendant et auto (//) dans la recherche.
SELECT AdditionalContactInfo.query('
declare namespace ci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
for $ph in /ci:AdditionalContactInfo//act:telephoneNumber
return
$ph/act:number
') as x
FROM Person.Contact
WHERE ContactID = 1
Voici le résultat obtenu :
\<act:number
xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
111-111-1111
\</act:number>
\<act:number
xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
112-111-1111
\</act:number>
Pour récupérer uniquement les numéros de téléphone de niveau supérieur, en particulier les <telephoneNumber
> éléments enfants de <AdditionalContactInfo
>, l’expression FOR dans la requête devient
for $ph in /ci:AdditionalContactInfo/act:telephoneNumber
.
Voir aussi
Concepts de base de XQuery
Construction XML (XQuery)
Données XML (SQL Server)