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, 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 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.

Consulte también

Conceptos básicos de XQuery