Поделиться через


Функции контекста — position (XQuery)

Область применения: SQL Server

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

Синтаксис

  
fn:position() as xs:integer  

Замечания

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

Примеры

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

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

Обратите внимание на следующие данные из предыдущего запроса:

  • Ключевое слово пространства имен в XQuery Prolog определяет префикс пространства имен, используемый в тексте запроса.

  • Текст запроса создает XML, имеющий <элемент Product> с атрибутами ProductModelID и ProductModelName , и имеет функции продукта, возвращаемые в качестве дочерних элементов.

  • Функция position() используется в предикате для определения положения дочернего <элемента Features> в контексте. Если он является первой или второй функцией, он возвращается.

  • Оператор IF добавляет элемент <"есть-больше" в> результат, если в каталоге продуктов есть более двух функций.

  • Так как не для всех моделей продуктов их описание из каталога хранится в таблице, используется предложение 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