Функция 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.