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


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

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

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

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

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

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

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

  • При конструировании атрибута OrignialLaborHours атомизация неявно применяется к одноэлементной последовательности, которую возвращает ($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() и выражениями сортировки, передаваемыми по порядку предложением.

См. также

Справочник

Основные понятия

Другие ресурсы