Функция position (XQuery)
Возвращает целочисленное значение, указывающее позицию контекстного элемента в последовательности обрабатываемых в данный момент элементов.
Синтаксис
fn:position() as xs:integer
Замечания
В SQL Server функция fn:position() может использоваться только в контексте контекстно-зависимого предиката. Конкретно, ее можно использовать только внутри квадратных скобок ([]). Сравнение с данной функцией не приводит к снижению числа элементов в процессе статического определения типов.
Примеры
В этом разделе представлен пример запроса XQuery в сравнении с экземплярами XML-модели, хранимыми в разных столбцах типа xml в базе данных AdventureWorks. Обзор каждого из этих столбцов см. в разделе Представление типов xml-данных в базе данных AdventureWorks.
A. Использование функции position() в запросе XQuery для получения первых двух характеристик продукта
Следующий запрос извлекает первые две характеристики — первые два дочерних <Features
> — из описания каталога моделей продуктов. Если характеристик больше, к результату добавляется элемент <there-is-more/
>.
SELECT CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product>
{ /pd:ProductDescription/@ProductModelID }
{ /pd:ProductDescription/@ProductModelName }
{
for $f in /pd:ProductDescription/pd:Features/*[position()<=2]
return
$f
}
{
if (count(/pd:ProductDescription/pd:Features/*) > 2)
then <there-is-more/>
else ()
}
</Product>
') as x
FROM Production.ProductModel
WHERE CatalogDescription is not null
Обратите внимание на следующие данные из предыдущего запроса.
- Ключевое слово namespace в прологе запроса XQuery определяет префикс пространства имен, используемый в теле запроса.
- Текст запроса создает структуру XML с элементом <Product> с атрибутами ProductModelID и ProductModelName и возвращаемыми в качестве дочерних элементов характеристиками продукта.
- Функция position() используется в предикате для определения позиции дочернего элемента <Features> в контексте. Если он является первой или второй функцией, он возвращается.
- Инструкция IF добавляет к результату элемент <there-is-more/>, если в каталоге продуктов хранится более двух характеристик данного продукта.
- Так как не для всех моделей продуктов их описание из каталога хранится в таблице, используется предложение WHERE для отсева строк, для которых значение CatalogDescriptions равно NULL.
Частичный результат:
<Product ProductModelID="19" ProductModelName="Mountain 100">
<p1:Warranty xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<p1:WarrantyPeriod>3 year</p1:WarrantyPeriod>
<p1:Description>parts and labor</p1:Description>
</p1:Warranty>
<p2:Maintenance xmlns:p2="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<p2:NoOfYears>10</p2:NoOfYears>
<p2:Description>maintenance contact available through your dealer or
any AdventureWorks retail store.</p2:Description>
</p2:Maintenance>
<there-is-more/>
</Product>
…
См. также
Справочник
Применение функций XQuery к типу данных XML