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


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

Применимо к:SQL Server

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

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

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. Запрос указан в столбце "Инструкции" типа XML в таблице ProductModel. Следующий запрос трижды возвращает атрибут LaborHours. Обратите внимание на следующие особенности запроса.

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

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

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() и выражениями упорядочивания, передаваемыми в порядке по предложению.

См. также

Основы XQuery
Выражения сравнения (XQuery)
Функции XQuery для типа данных XML