Partilhar via


Atomização (XQuery)

Aplica-se a:SQL Server

A atomização é o processo de extração do valor tipado de um item. Este processo está implícito em determinadas circunstâncias. Alguns dos operadores XQuery, como operadores aritméticos e de comparação, dependem desse processo. Por exemplo, quando você aplica operadores aritméticos diretamente aos nós, o valor digitado de um nó é recuperado primeiro 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 LaborHours atributos. Neste caso, data() é implicitamente aplicado aos nós de atributo.

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

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

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() é implicitamente aplicado para recuperar o valor atômico do LaborHours atributo. A consulta é especificada na coluna Instruções do tipo de xml na tabela ProductModel. A consulta a seguir retorna o LaborHours atributo três vezes. Na consulta, considere:

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

  • Na construção do UpdatedLaborHoursV1 atributo, o operador aritmético requer valores atômicos. Portanto, data() é implicitamente aplicado ao LaborHours atributo retornado por $WC/@LaborHours. O valor atómico 1 é-lhe então adicionado. A construção do atributo UpdatedLaborHoursV2 mostra a aplicação explícita do 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;

Eis 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 na comparação de parâmetros de expressão passados para funções, valores retornados por funções, cast() expressões e ordenação de expressões passadas na ordem por cláusula.