Função position (XQuery)
Retorna um valor inteiro que indica a posição do item de contexto na seqüência de itens que estão sendo processados atualmente.
Sintaxe
fn:position() as xs:integer
Comentários
No SQL Server, fn:position () pode ser usado somente no contexto de um predicado dependente de contexto. Especificamente, ele só pode ser usado entre colchetes ([ ]). 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 do tipo xml no banco de dados AdventureWorks. Para obter uma visão geral de cada uma dessas colunas, consulte Representação de tipo de dados xml no banco de dados do AdventureWorks.
A. Uso da função position() XQuery para recuperar os primeiros dois recursos de produto
A consulta a seguir recupera os primeiros dois recursos, os primeiros dois elementos filho do elemento <Features>, da descrição do catálogo de modelo de produtos. Se houver mais recursos, ele adicionará um elemento <there-is-more/> 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 Prólogo do XQuery define um prefixo de namespace usado no corpo da consulta.
O corpo da consulta constrói XML com um elemento <Product> com os 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 produto têm as descrições de catálogo armazenadas na tabela, a cláusula WHERE cláusula é 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>
…