Funções de Contexto – position (XQuery)
Aplica-se: SQL Server
Retorna um valor inteiro que indica a posição do item de contexto na sequência de itens que estão sendo processados atualmente.
Sintaxe
fn:position() as xs:integer
Comentários
No SQL Server, fn:position() só pode ser usado no contexto de um predicado dependente de contexto. Especificamente, ele só pode ser usado entre parênteses ([ ]). A comparação contra essa função não reduz a cardinalidade durante a inferência de tipo estática.
Exemplos
Este tópico fornece exemplos de XQuery em instâncias XML armazenadas em várias colunas de tipo xml no AdventureWorks2022
banco de dados.
R. Usando a função position() XQuery para recuperar os primeiros dois recursos de produto
A consulta a seguir recupera os dois primeiros recursos, os dois primeiros elementos filho do <Features
> elemento, da descrição do catálogo do modelo de produto. Se houver mais recursos, ele adiciona um <there-is-more/
> elemento ao resultado.
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
Observe o seguinte na consulta anterior:
A palavra-chave namespace no XQuery Prolog define um prefixo de namespace que é usado no corpo da consulta.
O corpo da consulta constrói XML que tem um <elemento Product> com atributos ProductModelID e ProductModelName e tem recursos de produto retornados como elementos filho.
A função position() é usada no predicado para determinar a posição do <elemento filho Features> no contexto. Se ele for o primeiro ou segundo recurso, será retornado.
A instrução IF adiciona um <elemento there-is-more/> ao resultado se houver mais de dois recursos no catálogo de produtos.
Como nem todos os modelos de produtos têm as descrições de catálogo armazenadas na tabela, a cláusula WHERE é usada para descartar linhas em que CatalogDescriptions é NULL.
Este é um resultado parcial:
<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>
...