Condividi tramite


Funzione sum (XQuery)

Restituisce la somma di una sequenza di numeri.

Sintassi

fn:sum($arg as xdt:anyAtomicType*) as xdt:anyAtomicType

Argomenti

  • $arg
    Sequenza di valori atomici per i quali deve essere calcolata la somma.

Osservazioni

Tutti i tipi di valori atomizzati passati a sum() devono essere sottotipi dello stesso tipo di base. I tipi di base accettati sono i tre tipi numerici di base predefiniti o xdt:untypedAtomic. Per i valori di tipo xdt:untypedAtomic viene eseguito il cast a xs:double. Se è presente una combinazione di questi tipi o se vengono passati altri valori di altri tipi, verrà generato un errore statico.

Nel risultato di sum() verrà inserito il tipo di base dei tipi passati, ad esempio xs:double nel caso del tipo xdt:untypedAtomic, anche se l'input è facoltativamente la sequenza vuota. Se l'input è costituito da dati statici vuoti, il risultato sarà 0 con il tipo statico e dinamico di xs:integer.

La funzione sum() restituisce la somma dei valori numerici. Se non è possibile eseguire il cast di un valore xdt:untypedAtomic a xs:double, tale valore viene ignorato nella sequenza di input, $arg. Se l'input è una sequenza vuota calcolata in modo dinamico, viene restituito il valore 0 del tipo di base utilizzato.

Se si verifica un overflow o un'eccezione di valori non compresi nell'intervallo, la funzione restituisce un errore di run-time.

Esempi

In questo argomento vengono forniti esempi di utilizzo del linguaggio XQuery sulle istanze XML archiviate in diverse colonne di tipo xml nel database AdventureWorks. Per una panoramica su ognuna di queste colonne, vedere Rappresentazione del tipo di dati XML nel database AdventureWorks.

A. Utilizzo della funzione XQuery sum() per trovare il numero totale combinato delle ore di manodopera relativo a tutti i centri di lavorazione del processo di produzione

La query seguente trova il numero totale delle ore di manodopera relativo a tutti i centri di lavorazione del processo di produzione per tutti i modelli di prodotto per i quali sono state archiviate istruzioni di produzione.

SELECT Instructions.query('       
   declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";       
  <ProductModel PMID= "{ sql:column("Production.ProductModel.ProductModelID") }"       
  ProductModelName = "{ sql:column("Production.ProductModel.Name") }" >       
   <TotalLaborHrs>       
     { sum(//AWMI:Location/@LaborHours) }       
   </TotalLaborHrs>       
 </ProductModel>       
    ') as Result       
FROM Production.ProductModel       
WHERE Instructions is not NULL       

Di seguito è riportato il risultato parziale.

<ProductModel PMID="7" ProductModelName="HL Touring Frame">
   <TotalLaborHrs>12.75</TotalLaborHrs>
</ProductModel>
<ProductModel PMID="10" ProductModelName="LL Touring Frame">
  <TotalLaborHrs>13</TotalLaborHrs>
</ProductModel>
...

Anziché restituire il risultato come codice XML, è possibile scrivere la query in modo da generare risultati relazionali, come illustrato nella query seguente:

SELECT ProductModelID,       
        Name,       
        Instructions.value('declare namespace 
      AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";       
    sum(//AWMI:Location/@LaborHours)', 'float') as TotalLaborHours       
FROM Production.ProductModel       
WHERE Instructions is not NULL        

Risultato parziale:

ProductModelID Name                 TotalLaborHours       
-------------- -------------------------------------------------
7              HL Touring Frame           12.75                 
10             LL Touring Frame           13                    
43             Touring Rear Wheel         3                     
...

Limitazioni di implementazione

Limitazioni:

  • È supportata unicamente la versione di sum() con un singolo argomento.

  • Se l'input è una sequenza vuota calcolata in modo dinamico, viene restituito il valore 0 del tipo di base utilizzato anziché il tipo xs:integer.

  • La funzione sum() mappa tutti i numeri interi a xs:decimal.

  • L'utilizzo della funzione sum() su valori di tipo xs:duration non è supportato.

  • Le sequenze che prevedono una combinazione di tipi di base non sono supportate.

  • Se si specifica sum((xs:double(“INF”), xs:double(“-INF”))), verrà generato un errore di dominio.

Vedere anche

Riferimento