Esecuzione di query XQuery che coinvolgono gerarchie

Si applica a:SQL Server

La maggior parte delle colonne di tipo xml nel database AdventureWorks sono documenti semistrutturati. I documenti archiviati nelle diverse righe possono pertanto avere aspetti diversi. Le query di esempio contenute in questo argomento illustrano come estrarre informazioni dai vari documenti.

Esempi

R. Recupero delle posizioni dei centri di lavorazione, insieme al primo passaggio di produzione eseguito in tali centri, dai documenti contenenti le istruzioni per la produzione

Per il modello di prodotto 7, la query costruisce xml che include l'elemento, con gli attributi ProductModelID e ProductModelName e uno o piùLocation><elementi figlio.<ManuInstr>

Ogni <Location> elemento ha un proprio set di attributi e un <step> elemento figlio. Questo <step> elemento figlio è il primo passaggio di produzione nella posizione del centro di lavoro.

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  

Dalla query precedente si noti quanto segue:

  • La parola chiave namespace nel prologo XQuery definisce un prefisso dello spazio dei nomi. Tale prefisso verrà utilizzato in seguito nel corpo della query.

  • I token per lo scambio di contesto, {) e (}, vengono utilizzati nella query per passare dalla costruzione delle informazioni XML alla valutazione della query.

  • Sql :column() viene usato per includere un valore relazionale nel codice XML che viene costruito.

  • Nella costruzione dell'elemento <Location> , $wc/@* recupera tutti gli attributi della posizione del centro di lavoro.

  • La funzione string() restituisce il valore stringa dell'elementostep<> .

Risultato parziale:

<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. Ricerca di tutti i numeri di telefono nella colonna AdditionalContactInfo

La query seguente recupera numeri di telefono aggiuntivi per un contatto cliente specifico eseguendo una ricerca nell'intera gerarchia per l'elemento <telephoneNumber> . Poiché l'elemento <telephoneNumber> può essere visualizzato in qualsiasi punto della gerarchia, la query usa l'operatore discendente e self (//) nella ricerca.

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  

Risultato:

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

Per recuperare solo i numeri di telefono di primo livello, in particolare gli <telephoneNumber> elementi figlio di <AdditionalContactInfo>, l'espressione FOR nella query cambia in

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

Vedi anche

Nozioni fondamentali su XQuery
Costruzione di strutture XML (XQuery)
Dati XML (SQL Server)