Secuencia y QName (XQuery)
Se aplica a:SQL Server
En este tema se describen los siguientes conceptos fundamentales de XQuery:
Secuencia
QName y espacio de nombres predefinido
Secuencia
En XQuery, el resultado de una expresión es una secuencia formada por una lista de nodos e instancias XML de tipos atómicos XSD. Una entrada concreta de una secuencia es un elemento. Un elemento de una secuencia puede ser:
Un nodo, como un elemento, atributo, texto, instrucción de procesamiento, comentario o documento
Un valor atómico, como una instancia de un tipo XSD simple
Por ejemplo, la consulta siguiente genera una secuencia de dos nodos de elemento:
SELECT Instructions.query('
<step1> Step 1 description goes here</step1>,
<step2> Step 2 description goes here </step2>
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7;
El resultado es el siguiente:
<step1> Step 1 description goes here </step1>
<step2> Step 2 description goes here </step2>
En la consulta anterior, la coma (,
) al final de la construcción <step1>
es el constructor de secuencia, y es obligatoria. Los espacios en blanco se agregan al resultado solo a modo de ilustración y se incluyen en los resultados de todos los ejemplos de esta documentación.
A continuación se ofrece información adicional que debe conocer sobre las secuencias:
Si una consulta genera una secuencia que contiene otra secuencia, la secuencia contenida se incluye como una secuencia plana en la secuencia contenedora. Por ejemplo, la secuencia ((1,2, (3,4,5)),6) pasa a ser la secuencia plana (1, 2, 3, 4, 5, 6) en el modelo de datos
DECLARE @x xml; SET @x = ''; SELECT @x.query('(1,2, (3,4,5)),6');
Una secuencia vacía es una secuencia que no contiene ningún elemento. Se representa como "()".
Una secuencia con un solo elemento se puede tratar como un valor atómico, y lo mismo a la inversa. Es decir, (1) = 1.
En esta implementación, la secuencia debe ser homogénea. Dicho de otro modo, será una secuencia de valores atómicos o una secuencia de nodos. Por ejemplo, las siguientes secuencias son válidas:
DECLARE @x xml;
SET @x = '';
-- Expression returns a sequence of 1 text node (singleton).
SELECT @x.query('1');
-- Expression returns a sequence of 2 text nodes
SELECT @x.query('"abc", "xyz"');
-- Expression returns a sequence of one atomic value. data() returns
-- typed value of the node.
SELECT @x.query('data(1)');
-- Expression returns a sequence of one element node.
-- In the expression XML construction is used to construct an element.
SELECT @x.query('<x> {1+2} </x>');
La consulta siguiente devuelve un error, porque no se admiten las secuencias heterogéneas.
SELECT @x.query('<x>11</x>, 22');
QName
Cada identificador de una expresión XQuery es un elemento QName. Un elemento QName se compone de un prefijo de espacio de nombres y un nombre local. En esta implementación, los nombres de variables de las expresiones XQuery son elementos QName y no pueden tener prefijos.
Considere el ejemplo siguiente en el que se especifica una consulta en una variable xml sin tipo:
DECLARE @x xml;
SET @x = '<Root><a>111</a></Root>';
SELECT @x.query('/Root/a');
En la expresión (/Root/a
), Root
y a
son elementos QName.
En el ejemplo siguiente, se especifica una consulta en una columna xml con tipo. La consulta recorre en iteración todos los <elementos de paso> en la primera ubicación del centro de trabajo.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $Step in /AWMI:root/AWMI:Location[1]/AWMI:step
return
string($Step)
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7;
En la expresión de la consulta, tenga en cuenta lo siguiente:
AWMI root
,AWMI:Location
,AWMI:step
y$Step
son elementos QName.AWMI
es un prefijo, yroot
,Location
yStep
son nombres locales.La variable
$step
es un elemento QName y no tiene prefijo.
Los siguientes espacios de nombres están predefinidos para su uso con la compatibilidad con XQuery en SQL Server.
Prefijo | Identificador URI |
---|---|
xs | http://www.w3.org/2001/XMLSchema |
xsi | http://www.w3.org/2001/XMLSchema-instance |
xdt | http://www.w3.org/2004/07/xpath-datatypes |
fn | http://www.w3.org/2004/07/xpath-functions |
(sin prefijo) | urn:schemas-microsoft-com:xml-sql |
sqltypes | https://schemas.microsoft.com/sqlserver/2004/sqltypes |
Xml | http://www.w3.org/XML/1998/namespace |
(sin prefijo) | https://schemas.microsoft.com/sqlserver/2004/SOAP |
Cada base de datos que cree tiene la colección de esquemas XML sys . Estos esquemas se reservan para que estén accesibles desde cualquier otra colección de esquemas XML creada por el usuario.
Nota
Esta implementación no admite el local
prefijo como se describe en la especificación XQuery de http://www.w3.org/2004/07/xquery-local-functions.