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