Поделиться через


Атомизация (XQuery)

Область применения:SQL Server

Атомизация — это процесс извлечения типизированного значения элемента. В определенных обстоятельствах подразумевается, что этот процесс будет осуществлен. Некоторые из операторов XQuery (например, арифметические и операторы сравнения), зависят от этого процесса. Например, при применении арифметических операторов непосредственно к узлам типизированное значение узла сначала извлекается путем неявного вызова функции данных. При этом атомарное значение передается в качестве операнда арифметическому оператору.

Например, следующий запрос возвращает общее количество LaborHours атрибутов. В этом случае data() неявно применяется к узлам атрибутов.

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

Хотя это не обязательно, можно также явно указать функцию data() :

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

Другой пример неявной атомизации — использование арифметических операторов. Оператор + требует атомарных значений и data() неявно применяется для получения атомарного значения атрибута LaborHours . Запрос указан в столбце "Инструкции" типа XML в таблице ProductModel. Следующий запрос возвращает LaborHours атрибут три раза. В запросе рассмотрим:

  • При создании атрибута OriginalLaborHours атомизация неявно применяется к однотонной последовательности, возвращаемой $WC/@LaborHours. Типизированное значение LaborHours атрибута назначается OriginalLaborHours.

  • При создании атрибута UpdatedLaborHoursV1 арифметический оператор требует атомарных значений. Поэтому неявно применяется к атрибуту, data() возвращаемого LaborHours$WC/@LaborHours. Затем к нему добавляется атомарное значение 1. Построение атрибута UpdatedLaborHoursV2 показывает явное применение data(), но не требуется.

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;

Ниже приведен результат:

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

Атомизация приводит к экземпляру простого типа, пустому множеству или к ошибке статического типа.

Атомизация также возникает в параметрах выражения сравнения, передаваемых функциям, значениям, возвращаемым функциями, cast() выражениями и упорядочиванием выражений, передаваемых в порядке по предложению.