Atomización (XQuery)

La atomización es un proceso que consiste en extraer el valor con tipo de un elemento. Este proceso se produce en determinadas circunstancias. Algunos de los operadores XQuery, como los aritméticos y los de comparación, dependen de este proceso. Por ejemplo, al aplicar operadores aritméticos directamente a los nodos, el valor con tipo de un nodo se recupera primero invocando implícitamente la función data. De esta manera, el valor atómico se pasa al operador aritmético como un operando.

Por ejemplo, la consulta siguiente devuelve el total de los atributos LaborHours. En este caso, data() se aplica implícitamente a los nodos 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)')

Aunque no es necesario, también puede especificar explícitamente la función data():

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

Otro ejemplo de atomización implícita se produce al utilizar operadores aritméticos. El operador + requiere valores atómicos y data() se aplica implícitamente para recuperar el valor atómico del atributo LaborHours. La consulta se especifica en la columna Instructions de tipo xml en la tabla ProductModel. La consulta siguiente devuelve el atributo LaborHours tres veces. Respecto a la consulta, observe lo siguiente:

  • Al construir el atributo OrigninalLaborHours, la atomización se aplica implícitamente a la secuencia singleton devuelta por ($WC/@LaborHours). El valor con tipo del atributo LaborHours se asigna a OrigninalLaborHours.

  • Al construir el atributo UpdatedLaborHoursV1, el operador aritmético requiere valores atómicos. Por tanto, data() se aplica implícitamente al atributo LaborHours devuelto por ($WC/@LaborHours). A continuación, se le agrega el valor atómico 1. La creación del atributo UpdatedLaborHoursV2 muestra la aplicación explícita de data(), pero no es obligatoria.

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

El resultado es el siguiente:

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

La atomización da lugar a una instancia de tipo simple, un conjunto vacío o un error de tipo estático.

La atomización también se produce en parámetros de expresiones de comparación que se pasan a funciones, valores devueltos por funciones, expresiones cast() y expresiones de orden pasadas en la cláusula order by.