Secuencia y QName (XQuery)
Se aplica a: SQL Server
En este tema se describen los siguientes conceptos fundamentales de XQuery:
Sequence
QName y espacio de nombres predefinido
Sequence
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 | 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.