Dela via


XQueries som involverar hierarki

gäller för:SQL Server

De flesta xml- typkolumner i databasen AdventureWorks är halvstrukturerade dokument. Därför kan dokument som lagras på varje rad se olika ut. Frågeexemplen i det här avsnittet visar hur du extraherar information från dessa olika dokument.

Exempel

A. Hämta arbetscenterplatser tillsammans med det första tillverkningssteget på dessa platser från dokumentationen om tillverkningsinstruktioner

För produktmodell 7 konstruerar frågan XML som innehåller elementet <ManuInstr>, med ProductModelID och ProductModelName attribut och ett eller flera <Location> underordnade element.

Varje <Location> element har en egen uppsättning attribut och ett <step> underordnat element. Det här <step> underordnade elementet är det första tillverkningssteget på arbetscentrets plats.

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  

Observera följande från föregående fråga:

  • Nyckelordet namnområde i XQuery Prolog definierar ett namnområdesprefix. Det här prefixet används senare i frågetexten.

  • Kontextväxlingstoken{) och (}, används för att växla frågan från XML-konstruktion till frågeutvärdering.

  • sql:column() används för att inkludera ett relationsvärde i XML-koden som skapas.

  • När du skapar <Location>-elementet hämtar $wc/@* alla platsattribut för arbetscentret.

  • Funktionen string() returnerar strängvärdet från <step>-elementet.

Detta är ett partiellt resultat:

<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. Hitta alla telefonnummer i kolumnen AdditionalContactInfo

Följande fråga hämtar ytterligare telefonnummer för en specifik kundkontakt genom att söka i hela hierarkin efter elementet <telephoneNumber>. Eftersom <telephoneNumber>-elementet kan visas var som helst i hierarkin använder frågan underordnade och självoperator (//) i sökningen.

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  

Det här är resultatet:

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

Om du bara vill hämta de översta telefonnumren, särskilt de <telephoneNumber> underordnade elementen i <AdditionalContactInfo>, ändras FOR-uttrycket i frågan till

for $ph in /ci:AdditionalContactInfo/act:telephoneNumber.

Se även

grunderna i XQuery
XML-konstruktion (XQuery)
XML-data (SQL Server)