Функции с узлами — number
Область применения: SQL Server
Возвращает числовое значение узла, указанного $arg.
Синтаксис
fn:number() as xs:double?
fn:number($arg as node()?) as xs:double?
Аргументы
$arg
Узел, значение которого будет возвращено в виде числа.
Замечания
Если $arg не задано, возвращается числовое значение узла контекста, преобразованное в двойное. В SQL Server fn:number() без аргумента можно использовать только в контексте предиката, зависящей от контекста. Точнее, она может использоваться только внутри квадратных скобок ([ ]). Например, следующее выражение возвращает <ROOT
> элемент.
declare @x xml
set @x='<ROOT>111</ROOT>'
select @x.query('/ROOT[number()=111]')
Если значение узла не является допустимым лексическим представлением числового простого типа, как определено в части XML Schema 2:Datatypes, рекомендация 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.