Функция position (XQuery)

Возвращает целочисленное значение, указывающее позицию контекстного элемента в последовательности обрабатываемых в данный момент элементов.

Синтаксис

fn:position() as xs:integer

Замечания

В SQL Server функция fn:position() может использоваться только в контексте контекстно-зависимого предиката. Конкретно ее можно использовать только внутри квадратных скобок ([]). Сравнение с данной функцией не приводит к снижению количества элементов в процессе статического определения типов.

Примеры

В этом разделе представлены примеры запросов XQuery к экземплярам XML, хранимым в разных столбцах типа xml в базе данных AdventureWorks2012 .

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