Dela via


Context Functions – position (XQuery)

gäller för:SQL Server

Returnerar ett heltalsvärde som anger positionen för kontextobjektet i sekvensen av objekt som bearbetas för närvarande.

Syntax

  
fn:position() as xs:integer  

Anmärkningar

I SQL Server kan fn:position() endast användas i kontexten för ett kontextberoende predikat. Mer specifikt kan den bara användas inom hakparenteser ([ ]). Om du jämför med den här funktionen minskar inte kardinaliteten vid statisk typinferens.

Exempel

Det här avsnittet innehåller XQuery-exempel mot XML-instanser som lagras i olika XML- typkolumner i AdventureWorks2022-databasen.

A. Använda funktionen position() XQuery för att hämta de två första produktfunktionerna

Följande fråga hämtar de två första funktionerna, de två första underordnade elementen i <Features>-elementet, från beskrivningen av produktmodellens katalog. Om det finns fler funktioner läggs ett <there-is-more/> element till i resultatet.

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  

Observera följande från föregående fråga:

  • Nyckelordet i XQuery Prolog definierar ett namnområdesprefix som används i frågetexten.

  • Frågetexten konstruerar XML som har ett <Product>-element med ProductModelID-- och ProductModelName--attribut och har produktfunktioner som returneras som underordnade element.

  • Funktionen position() används i predikatet för att fastställa positionen för <Funktioner> underordnat element i kontexten. Om det är den första eller andra funktionen returneras den.

  • IF-instruktionen lägger till ett <det finns fler/> element i resultatet om det finns fler än två funktioner i produktkatalogen.

  • Eftersom inte alla produktmodeller har sina katalogbeskrivningar lagrade i tabellen används WHERE-satsen för att ta bort rader där CatalogDescriptions är NULL.

Detta är ett partiellt resultat:

<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>   
...  

Se även

XQuery Functions mot xml-datatypen