Partilhar via


Sequência e QNames (XQuery)

Aplica-se a:SQL Server

Este tópico descreve os seguintes conceitos fundamentais do XQuery:

  • Sequência

  • QNames e namespaces predefinidos

Sequência

Em XQuery, o resultado de uma expressão é uma sequência composta por uma lista de nós XML e instâncias de tipos atômicos XSD. Uma entrada individual numa sequência é referida como um item. Um item em uma sequência pode ser um dos seguintes:

  • Um nó como um elemento, atributo, texto, instrução de processamento, comentário ou documento

  • Um valor atômico, como uma instância de um tipo simples XSD

Por exemplo, a consulta a seguir constrói uma sequência de dois itens de nó 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;  
  

Este é o resultado:

<step1> Step 1 description goes here </step1>  
<step2> Step 2 description goes here </step2>   

Na consulta anterior, a vírgula (,) no final da construção <step1> é o construtor da sequência e é necessária. Os espaços em branco nos resultados são adicionados apenas para ilustração e são incluídos em todos os resultados de exemplo nesta documentação.

A seguir estão informações adicionais que você deve saber sobre sequências:

  • Se uma consulta resultar em uma sequência que contém outra sequência, a sequência contida será nivelada na sequência do contêiner. Por exemplo, a sequência ((1,2, (3,4,5)),6) é nivelada no modelo de dados como (1, 2, 3, 4, 5, 6).

    DECLARE @x xml;  
    SET @x = '';  
    SELECT @x.query('(1,2, (3,4,5)),6');  
    
  • Uma sequência vazia é uma sequência que não contém nenhum item. É representado como "()".

  • Uma sequência com apenas um item pode ser tratada como um valor atômico e vice-versa. Ou seja, (1) = 1.

Nesta implementação, a sequência deve ser homogénea. Ou seja, ou você tem uma sequência de valores atômicos ou uma sequência de nós. Por exemplo, as seguintes sequências são 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>');  

A consulta a seguir retorna um erro, porque sequências heterogêneas não são suportadas.

SELECT @x.query('<x>11</x>, 22');  

QName

Cada identificador em um XQuery é um QName. Um QName é composto por um prefixo de namespace e um nome local. Nesta implementação, os nomes das variáveis no XQuery são QNames e não podem ter prefixos.

Considere o exemplo a seguir no qual uma consulta é especificada em relação a uma variável de xml não tipada:

DECLARE @x xml;  
SET @x = '<Root><a>111</a></Root>';  
SELECT @x.query('/Root/a');  

Na expressão (/Root/a), Root e a são QNames.

No exemplo a seguir, uma consulta é especificada em relação a uma coluna de xml digitada. A consulta itera todos os elementos <etapa> no primeiro local do workcenter.

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;  

Na expressão de consulta, observe o seguinte:

  • AWMI root, AWMI:Location, AWMI:stepe $Step são todos QNames. AWMI é um prefixo, e root, Locatione Step são todos nomes locais.

  • A variável $step é um QName e não tem um prefixo.

Os namespaces a seguir são predefinidos para uso com suporte a XQuery no SQL Server.

Prefixo 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
(sem prefixo) urn:schemas-microsoft-com:xml-sql
SQLTYPES https://schemas.microsoft.com/sqlserver/2004/sqltypes
XML http://www.w3.org/XML/1998/namespace
(sem prefixo) https://schemas.microsoft.com/sqlserver/2004/SOAP

Cada banco de dados que você cria tem o sys coleção de esquema XML. Ele reserva esses esquemas para que possam ser acessados a partir de qualquer coleção de esquemas XML criada pelo usuário.

Observação

Esta implementação não suporta o prefixo local conforme descrito na especificação XQuery no http://www.w3.org/2004/07/xquery-local-functions.

Ver também

Noções básicas do XQuery