Share via


Atomizzazione (XQuery)

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 recuperato innanzitutto richiamando la funzione data. Tale funzione passa il valore atomico come operando all'operatore aritmetico.

Ad esempio, la query seguente restituisce il numero totale di attributi LaborHours. In tal caso, la funzione data() viene applicata in modo implicito ai nodi 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)')

Sebbene non sia necessario, è inoltre 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 la funzione data() viene applicata in modo implicito per recuperare il valore atomico dell'attributo LaborHours. La query viene eseguita sulla colonna Instructions di tipo xml nella tabella ProductModel. La query seguente restituisce tre volte l'attributo LaborHours. Dalla query si noti quanto segue:

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

  • Nella costruzione dell'attributo UpdatedLaborHoursV1, l'operatore aritmetico richiede valori atomici. Pertanto, la funzione data() viene applicata in modo implicito all'attributo LaborHours restituito da ($WC/@LaborHours). Successivamente, viene aggiunto il valore atomico 1. Nella costruzione dell'attributo UpdatedLaborHoursV2 viene illustrata l'applicazione esplicita della funzione data(), che tuttavia non è necessaria.

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 viene inoltre eseguita per parametri di espressioni di confronto passati a funzioni, valori restituiti dalle funzioni, espressioni cast() ed espressioni di ordinamento passate alla clausola order by.