Espressioni primarie (XQuery)
Le espressioni primarie XQuery includono valori letterali, riferimenti a variabili, espressioni per elementi di contesto, costruttori e chiamate di funzioni.
Valori letterali
I valori letterali XQuery possono essere di tipo numerico o stringa. Un valore letterale stringa può includere riferimenti a entità predefinite, ognuno dei quali è costituito da una sequenza di caratteri. La sequenza inizia con una e commerciale che rappresenta un singolo carattere che altrimenti potrebbe avere un significato sintattico. Di seguito sono indicati i riferimenti a entità predefinite per XQuery.
Riferimento a entità |
Rappresenta |
---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
Un valore letterale stringa può contenere inoltre un riferimento a carattere, un riferimento in stile XML a un carattere Unicode, identificato dal relativo punto di codice decimale o esadecimale. Ad esempio, è possibile rappresentare il simbolo dell'euro mediante il riferimento a carattere "€".
[!NOTA]
SQL Server utilizza XML versione 1.0 come base per l'analisi.
Esempi
Negli esempi seguenti viene illustrato l'utilizzo dei valori letterali, nonché dei riferimenti a entità e di carattere.
Il codice restituisce un errore, in quanto i caratteri <' e '> hanno un significato speciale:
DECLARE @var XML
SET @var = ''
SELECT @var.query(' <SalaryRange>Salary > 50000 and < 100000</SalaryRange>')
GO
Se invece si utilizza un riferimento a entità, la query funziona.
DECLARE @var XML
SET @var = ''
SELECT @var.query(' <SalaryRange>Salary > 50000 and < 100000</SalaryRange>')
GO
Nell'esempio seguente viene illustrato l'utilizzo di un riferimento a carattere per rappresentare il simbolo dell'euro.
DECLARE @var XML
SET @var = ''
SELECT @var.query(' <a>€12.50</a>')
Di seguito è riportato il risultato.
<a>€12.50</a>
Nell'esempio seguente, la query è delimitata da apostrofi. Pertanto, l'apostrofo nel valore stringa è rappresentato da due apostrofi adiacenti.
DECLARE @var XML
SET @var = ''
SELECT @var.query('<a>I don''t know</a>')
Go
Di seguito è riportato il risultato.
<a>I don't know</a>
Per rappresentare valori booleani, è possibile utilizzare le funzioni booleane predefinite true() e false(), come illustrato nel'esempio seguente.
DECLARE @var XML
SET @var = ''
SELECT @var.query('<a>{true()}</a>')
GO
Il costruttore diretto di elementi specifica un'espressione tra parentesi graffe, che viene sostituita dal valore corrispondente nella struttura XML risultante.
Di seguito è riportato il risultato.
<a>true</a>
Riferimenti a variabili
In XQuery, un riferimento a una variabile è un elemento QName preceduto dal segno di dollaro ($). Tale implementazione supporta solo riferimenti a variabili senza prefisso. Ad esempio, la query seguente definisce la variabile $i nell'espressione FLWOR.
DECLARE @var XML
SET @var = '<root>1</root>'
SELECT @var.query('
for $i in /root return data($i)')
GO
La query seguente non funzionerà poiché viene aggiunto un prefisso dello spazio dei nomi al nome della variabile:
DECLARE @var XML
SET @var = '<root>1</root>'
SELECT @var.query('
DECLARE namespace x="http://X";
for $x:i in /root return data($x:i)')
GO
È possibile utilizzare la funzione di estensione sql:variable() per fare riferimento alle variabili SQL, come illustrato nella query seguente.
DECLARE @price money
SET @price=2500
DECLARE @x xml
SET @x = ''
SELECT @x.query('<value>{sql:variable("@price") }</value>')
Di seguito è riportato il risultato.
<value>2500</value>
Limitazioni di implementazione
Le limitazioni di implementazione sono le seguenti:
Non sono supportate variabili con prefissi dello spazio dei nomi.
Non è supportata l'importazione di moduli.
Non sono supportate dichiarazioni di variabili esterne. Per risolvere questo problema, è possibile utilizzare la funzione sql:variable().
Espressioni per elementi di contesto
Per elemento di contesto si intende l'elemento corrente elaborato nel contesto di un'espressione di percorso. Viene inizializzato in un'istanza con tipo di dati XML non NULL tramite il nodo di documento. È inoltre possibile modificarlo tramite il metodo nodes(), nel contesto di espressioni XPath o di predicati [].
L'elemento di contesto viene restituito da un'espressione che contiene un punto (.). Ad esempio, la query seguente valuta ogni elemento <a> per verificare la presenza dell'attributo attr. Se l'attributo è presente, viene restituito l'elemento. Si noti che la condizione del predicato specifica che il nodo di contesto è specificato da un solo punto.
DECLARE @var XML
SET @var = '<ROOT>
<a>1</a>
<a attr="1">2</a>
</ROOT>'
SELECT @var.query('/ROOT[1]/a[./@attr]')
Di seguito è riportato il risultato.
<a attr="1">2</a>
Chiamate di funzioni
È possibile chiamare funzioni XQuery predefinite, nonché le funzioni SQL Serversql:variable() e sql:column(). Per un elenco delle funzioni implementate, vedere Funzioni XQuery per il tipo di dati XML.
Limitazioni di implementazione
Le limitazioni di implementazione sono le seguenti:
Non è supportata la dichiarazione di funzione nel prologo XQuery.
Non è supportata l'importazione di funzioni.