Seqüência e QNames (XQuery)

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

  • Seqüência

  • QNames e namespaces predefinidos

Seqüência

No XQuery, o resultado de uma expressão é uma seqüência constituída de uma lista de nós e instâncias XML de tipos atômicos XSD. Uma entrada individual em uma seqüência é chamada de item. Um item em uma seqüência pode ser qualquer 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 de XSD

Por exemplo, a consulta a seguir constrói uma seqüência de dois itens de nós do 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 fim da construção <step1> é o construtor de seqüência e é necessária. Os espaços em branco nos resultados são introduzidos apenas para fins ilustrativos e são inclusos em todos os resultados dos exemplos nessa documentação.

A seguir são apresentadas informações adicionais de seu interesse sobre seqüências:

  • Se uma consulta resultar em uma seqüência que contém outra seqüência, a seqüência contida é simplificada na seqüência de contêiner. Por exemplo, a seqüência ((1,2, (3,4,5)),6) é simplificada 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 seqüência vazia é uma seqüência que não contém nenhum item. Ela é representada como "()".

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

Nessa implementação, a seqüência deve ser homogênea. Ou seja, ou você tem uma seqüência de valores atômicos ou uma seqüência de nós. Por exemplo, as seguintes são seqüências 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 não há suporte para seqüências heterogêneas.

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

QName

Todo identificador em um XQuery é um QName. Um QName é constituído de um prefixo de namespace e de um nome local. Nessa implementação, os nomes de variáveis no XQuery são QNames e eles não podem ter prefixos.

Considere o exemplo a seguir, no qual uma consulta é especificada em uma variável xml não digitada:

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 uma coluna xml digitada. A consulta é iterada sobre todos os elementos <step> no local do primeiro centro de trabalho.

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 da consulta, observe o seguinte:

  • AWMI root, AWMI:Location, AWMI:step e $Step são todos QNames. AWMI é um prefixo, e root, Location e 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 do 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

(nenhum prefixo)

urn:schemas-microsoft-com:xml-sql

sqltypes

https://schemas.microsoft.com/sqlserver/2004/sqltypes

xml

http://www.w3.org/XML/1998/namespace

(nenhum prefixo)

https://schemas.microsoft.com/sqlserver/2004/SOAP

Todo banco de dados que você cria tem a coleção de esquemas XML sys. Ele reserva esses esquemas para que eles possam ser acessados de qualquer coleção de esquemas XML criadas pelo usuário. Para obter mais informações, consulte Coleção de esquema XML interna (sys).

ObservaçãoObservação

Essa implementação não oferece suporte ao prefixo local como descrito na especificação do XQuery em http://www.w3.org/2004/07/xquery-local-functions.

Consulte também

Conceitos

Outros recursos