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


Функция number (XQuery)

Возвращает числовое значение узла, указанного аргументом $arg.

Синтаксис

fn:number() as xs:double? 
fn:number($arg as node()?) as xs:double?

Аргументы

  • $arg
    Узел, значение которого будет возвращено в виде числа.

Замечания

Если аргумент $arg не указан, возвращается числовое значение контекстного узла, преобразуемого к типу double. В SQL Server функция fn:number() без аргумента может быть использована только в качестве контекстно-зависимого предиката. Точнее, она может использоваться только внутри квадратных скобок ([ ]). Например, следующее выражение возвращает элемент <ROOT>.

declare @x xml
set @x='<ROOT>111</ROOT>'
select @x.query('/ROOT[number()=111]')

Если значение узла не является допустимым лексическим представлением простого числового типа, как указано в разделе XML-схемы, часть 2: типы данных, рекомендация W3C, функция возвращает пустую последовательность. Синтаксис NaN не поддерживается.

Примеры

В этом разделе рассматриваются примеры запросов XQuery к экземплярам XML, хранимым в различных столбцах типа xml в базе данных AdventureWorks.

А.Использование функции number() языка XQuery для получения числового значения атрибута

В следующем запросе получается числовое значение атрибута, представляющего объем партии, производимого в первом цехе, участвующем в производственном процессе для модели продукта 7.

SELECT ProductModelID, Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" ;
     for $i in (//AWMI:root//AWMI:Location)[1]
     return 
       <Location LocationID="{ ($i/@LocationID) }" 
                   LotSizeA="{  $i/@LotSize }"
                   LotSizeB="{  number($i/@LotSize) }"
                   LotSizeC="{ number($i/@LotSize) + 1 }" >
                   
       </Location>
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7

В предыдущем запросе обратите внимание на следующее.

  • Функция number(), указанная в запросе для атрибута LotSizeA, не требуется. Это функция языка XPath 1.0, и она включена в основном по причинам обратной совместимости;

  • Язык XQuery для LotSizeB указывает числовую функцию и является избыточным.

  • запрос для LotSizeD иллюстрирует использование числового значения в арифметической операции.

Результат:

ProductModelID   Result
----------------------------------------------
7              <Location LocationID="10" 
                         LotSizeA="100" 
                         LotSizeB="100" 
                         LotSizeC="101" />

Ограничения реализации

Существуют следующие ограничения:

  • функция number() принимает в качестве аргументов только узлы. Она не принимает атомарных значений;

  • если значения не могут быть возвращены в виде числа, функция number() возвращает пустую последовательность вместо NaN.

См. также

Справочник

Функции XQuery для типа данных xml