Expresiones principales (XQuery)
Las expresiones principales de XQuery incluyen literales, referencias de variables, expresiones de elementos de contexto, constructores y llamadas a funciones.
Literales
Los literales de XQuery pueden ser numéricos o de cadena. Un literal de cadena puede incluir referencias de entidades predefinidas. Una referencia de entidad es una secuencia de caracteres. La secuencia empieza con un "y" comercial (&) que representa un solo carácter que, en otra situación, tendría un significado sintáctico. A continuación se exponen las referencias de entidades predefinidas de XQuery.
Referencia de entidad |
Representa |
---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
Un literal de cadena también puede contener una referencia de carácter, una referencia de estilo XML a un carácter Unicode, que se identifica mediante su punto de código decimal o hexadecimal. Por ejemplo, el símbolo del euro se puede representar mediante su referencia de carácter, "€".
[!NOTA]
SQL Server utiliza la versión 1.0 de XML como base para el análisis.
Ejemplos
Los ejemplos siguientes ilustran la utilización de literales y las referencias de entidad y carácter.
Este código devuelve un error porque los caracteres <' y '> tienen un significado especial.
DECLARE @var XML
SET @var = ''
SELECT @var.query(' <SalaryRange>Salary > 50000 and < 100000</SalaryRange>')
GO
Si utiliza una referencia de entidad en su lugar, la consulta funcionará:
DECLARE @var XML
SET @var = ''
SELECT @var.query(' <SalaryRange>Salary > 50000 and < 100000</SalaryRange>')
GO
En el ejemplo siguiente se ilustra el uso de una referencia de carácter para representar el símbolo del euro.
DECLARE @var XML
SET @var = ''
SELECT @var.query(' <a>€12.50</a>')
Éste es el resultado.
<a>€12.50</a>
En el ejemplo siguiente, la consulta está delimitada por apóstrofos. Por tanto, el apóstrofo del valor de cadena se representa mediante dos apóstrofos adyacentes.
DECLARE @var XML
SET @var = ''
SELECT @var.query('<a>I don''t know</a>')
Go
Éste es el resultado.
<a>I don't know</a>
Las funciones booleanas integradas, true() y false(), se pueden utilizar para representar valores booleanos, tal como se muestra en el ejemplo siguiente.
DECLARE @var XML
SET @var = ''
SELECT @var.query('<a>{true()}</a>')
GO
El constructor de elemento directo especifica una expresión entre llaves. Ésta se reemplazará por su valor en el XML resultante.
Éste es el resultado.
<a>true</a>
Referencias de variable
Una referencia de variable en XQuery es un QName precedido de un signo $. Esta implementación solo admite las referencias de variable sin prefijo. Por ejemplo, en la consulta siguiente se define la variable $i en la expresión FLWOR:
DECLARE @var XML
SET @var = '<root>1</root>'
SELECT @var.query('
for $i in /root return data($i)')
GO
La consulta siguiente no funcionará porque se ha agregado un prefijo de espacio de nombres al nombre de la variable.
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
Se puede utilizar la función de extensión sql:variable() para hacer referencia a variables de SQL, tal como se muestra en la consulta siguiente.
DECLARE @price money
SET @price=2500
DECLARE @x xml
SET @x = ''
SELECT @x.query('<value>{sql:variable("@price") }</value>')
Éste es el resultado.
<value>2500</value>
Limitaciones de la implementación
Éstas son las limitaciones de la implementación:
No se admiten las variables con prefijos de espacio de nombres.
No se admite la importación de módulos.
No se admiten las declaraciones de variables externas. Una solución consiste en utilizar la función sql:variable().
Expresiones de elementos de contexto
El elemento de contexto es el elemento que se está procesando en el contexto de una expresión de ruta de acceso. Se inicializa en una instancia de tipo de datos XML distinta de NULL con el nodo de documento. También se puede cambiar por el método nodes() en el contexto de expresiones XPath o de los predicados [].
Una expresión que contiene un punto (.) devuelve el elemento de contexto. Por ejemplo, la consulta siguiente evalúa cada elemento <a> para detectar la presencia del atributo attr. Si el atributo está presente, se devuelve el elemento. Tenga en cuenta que la condición del predicado especifica que el nodo de contexto se especifica mediante 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]')
Éste es el resultado.
<a attr="1">2</a>
Llamadas a funciones
Puede llamar a funciones de XQuery integradas y a las funciones de SQL Server sql:variable() y sql:column(). Para obtener una lista de funciones implementadas, consulte Funciones de XQuery con el tipo de datos xml.
Limitaciones de la implementación
Éstas son las limitaciones de la implementación:
No se admite la declaración de funciones en el prólogo de XQuery.
No se admite la importación de funciones.