Dela via


Primära uttryck (XQuery)

gäller för:SQL Server

De primära XQuery-uttrycken innehåller literaler, variabelreferenser, kontextobjektuttryck, konstruktorer och funktionsanrop.

Litteraler

XQuery-literaler kan vara numeriska eller strängliteraler. En strängliteral kan innehålla fördefinierade entitetsreferenser och en entitetsreferens är en sekvens med tecken. Sekvensen börjar med ett et-tecken som representerar ett enda tecken som annars kan ha syntaktisk signifikans. Följande är de fördefinierade entitetsreferenserna för XQuery.

Entitetsreferens Representerar
&lt; <
&gt; >
&amp; &
&quot; "
&apos; '

En strängliteral kan också innehålla en teckenreferens, en XML-stilreferens till ett Unicode-tecken, som identifieras med dess decimal- eller hexadecimala kodpunkt. Eurosymbolen kan till exempel representeras av teckenreferensen "€".

Not

SQL Server använder XML-version 1.0 som grund för parsning.

Exempel

Följande exempel illustrerar användningen av literaler och även entitets- och teckenreferenser.

Den här koden returnerar ett fel eftersom <' och '> tecken har en särskild betydelse.

DECLARE @var XML  
SET @var = ''  
SELECT @var.query(' <SalaryRange>Salary > 50000 and < 100000</SalaryRange>')  
GO  

Om du använder en entitetsreferens i stället fungerar frågan.

DECLARE @var XML  
SET @var = ''  
SELECT @var.query(' <SalaryRange>Salary &gt; 50000 and &lt; 100000</SalaryRange>')  
GO  

I följande exempel illustreras användningen av en teckenreferens för att representera eurosymbolen.

DECLARE @var XML  
SET @var = ''  
SELECT @var.query(' <a>€12.50</a>')  

Det här är resultatet.

<a>€12.50</a>

I följande exempel avgränsas frågan av apostrofer. Därför representeras apostrofen i strängvärdet av två intilliggande apostrofer.

DECLARE @var XML  
SET @var = ''  
SELECT @var.query('<a>I don''t know</a>')  
Go  

Det här är resultatet.

<a>I don't know</a>

De inbyggda booleska funktionerna, true() och false(), kan användas för att representera booleska värden, som du ser i följande exempel.

DECLARE @var XML  
SET @var = ''  
SELECT @var.query('<a>{true()}</a>')  
GO  

Konstruktorn för direktelement anger ett uttryck i klammerparenteser. Detta ersätts med dess värde i den resulterande XML-koden.

Det här är resultatet.

<a>true</a>

Variabelreferenser

En variabelreferens i XQuery är ett QName som föregås av ett $-tecken. Den här implementeringen stöder endast inaktuella variabelreferenser. Följande fråga definierar till exempel variabeln $i i FLWOR-uttrycket.

DECLARE @var XML  
SET @var = '<root>1</root>'  
SELECT @var.query('  
 for $i in /root return data($i)')  
GO  

Följande fråga fungerar inte eftersom ett namnområdesprefix läggs till i variabelnamnet.

DECLARE @var XML  
SET @var = '<root>1</root>'  
SELECT @var.query('  
DECLARE namespace x="https://X";  
for $x:i in /root return data($x:i)')  
GO  

Du kan använda funktionen sql:variable() för att referera till SQL-variabler, som du ser i följande fråga.

DECLARE @price money  
SET @price=2500  
DECLARE @x xml  
SET @x = ''  
SELECT @x.query('<value>{sql:variable("@price") }</value>')  

Det här är resultatet.

<value>2500</value>

Implementeringsbegränsningar

Det här är implementeringsbegränsningarna:

  • Variabler med namnområdesprefix stöds inte.

  • Modulimport stöds inte.

  • Externa variabeldeklarationer stöds inte. En lösning på detta är att använda funktionen sql:variable().

Uttryck för kontextobjekt

Kontextobjektet är det objekt som för närvarande bearbetas i kontexten för ett sökvägsuttryck. Den initieras i en instans av xml-datatypen not-NULL med dokumentnoden. Det kan också ändras med metoden nodes() i kontexten för XPath-uttryck eller [] predikat.

Kontextobjektet returneras av ett uttryck som innehåller en punkt (.). Följande fråga utvärderar till exempel varje element <a> för förekomsten av attributet attr. Om attributet finns returneras elementet. Observera att villkoret i predikatet anger att kontextnoden anges per enskild period.

DECLARE @var XML  
SET @var = '<ROOT>  
<a>1</a>  
<a attr="1">2</a>  
</ROOT>'  
SELECT @var.query('/ROOT[1]/a[./@attr]')  

Det här är resultatet.

<a attr="1">2</a>

Funktionsanrop

Du kan anropa inbyggda XQuery-funktioner och funktionerna SQL Server sql:variable() och sql:column(). En lista över implementerade funktioner finns i XQuery Functions mot xml-datatypen.

Implementeringsbegränsningar

Det här är implementeringsbegränsningarna:

  • Funktionsdeklaration i XQuery-prolog stöds inte.

  • Funktionsimport stöds inte.

Se även

XML-konstruktion (XQuery)