Share via


Atomização (XQuery)

Aplica-se a:SQL Server

A atomização é o processo de extrair o valor digitado de um item. Esse processo está implícito em determinadas circunstâncias. Alguns dos operadores XQuery, como operadores de aritmética e de comparação, dependem desse processo. Por exemplo, quando você aplica operadores aritméticos diretamente a nós, o valor digitado de um nó é recuperado pela primeira vez invocando implicitamente a função de dados. Isso passa o valor atômico como um operando para o operador aritmético.

Por exemplo, a consulta a seguir retorna o total dos atributos LaborHours. Nesse caso, data() é aplicado implicitamente aos nós de atributo.

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)')  

Embora não seja necessário, você também pode especificar explicitamente a função data():

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

Outro exemplo de atomização implícita é quando você usa operadores aritméticos. O + operador requer valores atômicos e data() é aplicado implicitamente para recuperar o valor atômico do atributo LaborHours. A consulta é especificada na coluna Instruções do tipo xml na tabela ProductModel. A consulta a seguir retorna o atributo LaborHours três vezes. Na consulta, observe o seguinte:

  • Na construção do atributo OriginalLaborHours, a atomização é aplicada implicitamente à sequência de singleton retornada por ($WC/@LaborHours). O valor digitado do atributo LaborHours é atribuído a OriginalLaborHours.

  • Na construção do atributo UpdatedLaborHoursV1, o operador aritmético requer valores atômicos. Portanto, data() é implicitamente aplicado ao atributo LaborHours retornado por ($WC/@LaborHours). O valor atômico 1 é então adicionado a ele. A construção do atributo UpdatedLaborHoursV2 mostra a aplicação explícita de data(), mas não é necessária.

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  

Este é o resultado:

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

A atomização resulta em uma instância de um tipo simples, um conjunto vazio ou um erro de tipo estático.

A atomização também ocorre em parâmetros de expressão de comparação passados para funções, valores retornados por funções, expressões cast() e expressões de ordenação passadas na cláusula order by.

Consulte Também

Fundamentos de XQuery
Expressões de Comparação (XQuery)
Funções XQuery em tipos de dados xml