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


Функция 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 в базе данных База данных AdventureWorks2008R2. Обзор каждого из этих столбцов см. в разделе Представление типов данных XML в базе данных AdventureWorks2008R2.

A. Использование функции 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.

См. также

Справочник