Partilhar via


Função sum (XQuery)

Retorna a soma de uma seqüência de números.

Sintaxe

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

Argumentos

  • $arg
    Seqüência de valores atômicos cuja soma deve ser calculada.

Comentários

Todos os tipos de valores atomizados que são passados para sum() têm que ser subtipos do mesmo tipo base. Os tipos base aceitos são os três tipos base numéricos internos ou xdt:untypedAtomic. Valores do tipo xdt:untypedAtomic são convertidos em xs:double. Se houver uma mistura desses tipos, ou se outros valores de outros tipos forem passados, um erro estático será gerado.

O resultado de sum() recebe o tipo base dos tipos passados em tipos, como xs:double no caso de xdt:untypedAtomic, mesmo se a entrada for opcionalmente a seqüência vazia. Se a entrada estiver estaticamente vazia, o resultado será 0 com o tipo estático e dinâmico de xs:integer.

A função sum() retorna a soma dos valores numéricos. Se um valor xdt:untypedAtomic não puder ser convertido em a xs:double, o valor será desconsiderado na seqüência de entrada $arg. Se a entrada for uma seqüência vazia dinamicamente calculada, o valor 0 do tipo base usado será retornado.

A função retorna um erro de tempo de execução quando um estouro ou exceção fora do intervalo acontece.

Exemplos

Este tópico fornece exemplos de XQuery em instâncias XML armazenadas em várias colunas do tipo xml no banco de dados AdventureWorks. Para obter uma visão geral de cada uma dessas colunas, consulte Representação de tipo de dados xml no banco de dados do AdventureWorks.

A. Usando a função sum () XQuery para localizar o número combinado total de horas de trabalho para todos os locais de centro de trabalho no processo de fabricação.

A consulta a seguir acha o total de horas de trabalho de todos os locais de centro de trabalho no processo de fabricação de todos os modelos de produtos nos quais as instruções de fabricação são armazenadas.

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       

Este é o resultado parcial.

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

Em vez de retornar o resultado como XML, você pode escrever a consulta para gerar resultados relacionais, como mostrado nesta consulta:

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        

Este é um resultado parcial:

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

Limitações de implementação

Estas são as limitações:

  • Só há suporte para a versão de argumento simples sum().

  • Se a entrada for uma seqüência vazia dinamicamente calculada, o valor 0 do tipo base usado será retornado, em vez do tipo xs:integer.

  • A função sum() mapeia todos os inteiros para xs:decimal.

  • Não há suporte para a função sum() em valores do tipo xs:duration.

  • Não há suporte para seqüências que misturam tipos nos limites de tipo base.

  • sum((xs:double ("INF"), xs:double ("- INF"))) gera um erro de domínio.

Consulte também

Referência