Condividi tramite


Atomizzazione (XQuery)

Si applica a: SQL Server

Per atomizzazione si intende il processo di estrazione del valore tipizzato di un elemento. In determinate circostanze, il processo è implicito. Alcuni operatori XQuery, ad esempio gli operatori aritmetici e di confronto, dipendono da tale processo. Ad esempio, quando si applicano operatori aritmetici direttamente ai nodi, il valore tipizzato di un nodo viene prima recuperato richiamando in modo implicito la funzione di dati. Tale funzione passa il valore atomico come operando all'operatore aritmetico.

Ad esempio, la query seguente restituisce il numero totale di attributi LaborHours. In questo caso, data() viene applicato in modo implicito ai nodi dell'attributo.

declare @x xml  
set @x='<ROOT><Location LID="1" SetupTime="1.1" LaborHours="3.3" />  
<Location LID="2" SetupTime="1.0" LaborHours="5" />  
<Location LID="3" SetupTime="2.1" LaborHours="4" />  
</ROOT>'  
-- data() implicitly applied to the attribute node sequence.  
SELECT @x.query('sum(/ROOT/Location/@LaborHours)')  

Anche se non è necessario, è anche possibile specificare in modo esplicito la funzione data():

SELECT @x.query('sum(data(ROOT/Location/@LaborHours))')  

Un altro esempio di atomizzazione implicita riguarda l'utilizzo di operatori aritmetici. L'operatore + richiede valori atomici e data() viene applicato in modo implicito per recuperare il valore atomico dell'attributo LaborHours. La query viene specificata sulla colonna Instructions del tipo xml nella tabella ProductModel. La query seguente restituisce tre volte l'attributo LaborHours. Dalla query si noti quanto segue:

  • Nella costruzione dell'attributo OriginalLaborHours, l'atomizzazione viene applicata in modo implicito alla sequenza singleton restituita da ($WC/@LaborHours). Il valore tipizzato dell'attributo LaborHours viene assegnato a OriginalLaborHours.

  • Nella costruzione dell'attributo UpdatedLaborHoursV1, l'operatore aritmetico richiede valori atomici. Di conseguenza, data() viene applicato in modo implicito all'attributo LaborHours restituito da ($WC/@LaborHours). Successivamente, viene aggiunto il valore atomico 1. La costruzione dell'attributo UpdatedLaborHoursV2 mostra l'applicazione esplicita di data(), ma non è obbligatoria.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
for $WC in /AWMI:root/AWMI:Location[1]  
        return  
            <WC OriginalLaborHours = "{ $WC/@LaborHours }"  
                UpdatedLaborHoursV1 = "{ $WC/@LaborHours + 1 }"   
                UpdatedLaborHoursV2 = "{ data($WC/@LaborHours) + 1 }" >  
            </WC>') as Result  
FROM Production.ProductModel  
where ProductModelID=7  

Risultato:

<WC OriginalLaborHours="2.5"   
    UpdatedLaborHoursV1="3.5"   
    UpdatedLaborHoursV2="3.5" />  

L'atomizzazione restituisce un'istanza di tipo semplice, un set vuoto o un errore di tipo statico.

L'atomizzazione si verifica anche nei parametri delle espressioni di confronto passati a funzioni, valori restituiti da funzioni, espressioni cast() ed espressioni di ordinamento passate nella clausola order by.

Vedi anche

Nozioni fondamentali su XQuery
Espressioni di confronto (XQuery)
Funzioni XQuery per il tipo di dati XML