Compartir a través de


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, y root, Location y Step 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.

Consulte también

Conceptos básicos de XQuery