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 totale degli LaborHours attributi. In questo caso, data() viene applicato in modo implicito ai nodi dell'attributo.

DECLARE @x AS 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 data() funzione :

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 l'attributo LaborHours tre volte. Nella query prendere in considerazione:

  • Nella costruzione dell'attributo, l'atomizzazione OriginalLaborHours 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, l'operatore UpdatedLaborHoursV1 aritmetico richiede valori atomici. Pertanto, 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;

Il risultato è il seguente:

<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, cast() espressioni ed espressioni di ordinamento passate nella clausola order by.