Contexto de expressão e avaliação de consulta (XQuery)

O contexto de uma expressão é a informação usada para analisá-la e avaliá-la. A seguir há duas fases nas quais o XQuery é avaliado:

  • Contexto estático - Esta é a fase de compilação da consulta. Com base nas informações disponíveis, os erros às vezes ocorrem durante essa análise estática da consulta.

  • Contexto dinâmico - Esta é a fase de execução da consulta. Mesmo se uma consulta não tiver erros estáticos, como erros durante a compilação da consulta, a consulta poderá retornar erros durante sua execução.

Contexto estático

A inicialização de contexto estático refere-se ao processo de reunir todas as informações para análise estática da expressão. Como parte da inicialização do contexto estático, o seguinte é completado:

  • A diretiva de boundary white space é configurada para ser eliminada. Portanto, a boundary white space não é preservada pelos construtores any element e attribute na consulta. Por exemplo:

    declare @x xml
    set @x=''
    select @x.query('<a>  {"Hello"}  </a>,
    
        <b> {"Hello2"}  </b>')
    

    Esta consulta retorna o resultado a seguir, porque boundary space é retirado durante a análise da expressão XQuery:

    <a>Hello</a><b>Hello2</b>
    
  • O prefixo e a associação de namespace são inicializados para o seguinte:

    • Um conjunto de namespaces predefinidos.

    • Qualquer namespace definido usando WITH XMLNAMESPACES. Para obter mais informações, consulte Adicionando namespaces usando WITH XMLNAMESPACES.

    • Qualquer namespace definido no prólogo da consulta. Observe que as declarações de namespace no prólogo podem substituir a declaração de namespace no WITH XMLNAMESPACES. Por exemplo, na consulta a seguir, WITH XMLNAMESPACES declara um prefixo (pd) que o associa ao namespace (http://someURI). Entretanto, na cláusula WHERE, o prólogo da consulta substitui a associação.

      WITH XMLNAMESPACES ('http://someURI' AS pd)
      SELECT ProductModelID, CatalogDescription.query('
          <Product 
              ProductModelID= "{ sql:column("ProductModelID") }" 
              />
      ') AS Result
      FROM Production.ProductModel
      WHERE CatalogDescription.exist('
          declare namespace  pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
           /pd:ProductDescription[(pd:Specifications)]'
          ) = 1
      

    Todas essas associações de namespace são resolvidas durante a inicialização de contexto estática.

  • Se consultar uma coluna ou variável xml digitada, os componentes da coleção de esquemas XML associados com a coluna ou variável serão importados no contexto estático. Para obter mais informações, consulte XML digitado comparado com XML não digitado.

  • Para todo tipo atômico nos esquemas importados, uma função de conversão também se torna disponível no contexto estático. Isso é ilustrado no exemplo a seguir. Nesse exemplo, uma consulta é especificada em uma variável xml digitada. A coleção de esquemas XML associada a essa variável define um tipo atômico, myType. Correspondendo a esse tipo, uma função de lançamento, myType(), está disponível durante as análises estáticas. A expressão de consulta (ns:myType(0)) retorna um valor de myType.

    -- DROP XML SCHEMA COLLECTION SC
    -- go
    CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="myNS" xmlns:ns="myNS"
    xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">
          <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>
          <simpleType name="myType">
                <restriction base="int">
                 <enumeration value="0" />
                  <enumeration value="1"/>
                </restriction>
          </simpleType>
          <element name="root" type="ns:myType"/>
    </schema>'
    go
    
    DECLARE @var XML(SC)
    SET @var = '<root xmlns="myNS">0</root>'
    -- specify myType() casting function in the query
    SELECT @var.query('declare namespace ns="myNS"; ns:myType(0)')
    

    No exemplo a seguir, a função de conversão do tipo XML interno int é especificada na expressão.

    declare @x xml
    set @x = ''
    select @x.query('xs:int(5)')
    go
    

Depois que o contexto estático é inicializado, a expressão de consulta é analisada (compilada). A análise estática envolve o seguinte:

  1. Análise de consulta.

  2. Resolução dos nomes de tipo e função especificados na expressão.

  3. Digitação estática da consulta. Isso garante que a consulta é do tipo seguro. Por exemplo, a consulta a seguir retorna um erro estático, pois o operador + requer argumentos de tipo primitivo numéricos:

    declare @x xml
    set @x=''
    SELECT @x.query('"x" + 4')
    

    No exemplo a seguir, o operador value() requer um singleton. Como especificado no esquema XML, pode haver vários elementos <Elem>. A análise estática da expressão estabelece que não é de tipo seguro e um erro estático é retornado. Para resolver o erro, a expressão deve ser reescrita para especificar um singleton (data(/x:Elem)[1]) explicitamente.

    DROP XML SCHEMA COLLECTION SC
    go
    CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="myNS" xmlns:ns="myNS"
    xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">
          <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>
          <element name="Elem" type="string"/>
    </schema>'
    go
    
    declare @x xml (SC)
    set @x='<Elem xmlns="myNS">test</Elem><Elem xmlns="myNS">test2</Elem>'
    SELECT @x.value('declare namespace x="myNS"; data(/x:Elem)[1]','varchar(20)')
    

    Para obter mais informações, consulte XQuery e digitação estática.

Restrições de implementação

A seguir são apresentadas as limitações relacionadas ao contexto estático:

  • Não há suporte para o modo de compatibilidade XPath.

  • Para a construção XML, só há suporte para o modo de construção de tira. Essa é a configuração padrão. Portanto, o tipo do nó de elemento construído é do tipo xdt:untyped e os atributos são do tipo xdt:untypedAtomic.

  • Só há suporte para o modo de ordenação ordenada.

  • Só há suporte para a diretiva de espaço de tira XML.

  • Não há suporte para a funcionalidade de URI base.

  • Não há suporte para fn:doc() .

  • Não há suporte para fn:collection().

  • O sinalizador estático do XQuery não é fornecido.

  • O agrupamento associado com o tipo de dados xml é usado. Este agrupamento sempre é definido como agrupamento Unicode Codepoint.

Contexto dinâmico

O contexto dinâmico refere-se a informações que devem estar disponíveis no momento que a expressão é executada. Além do contexto estático, as informações a seguir são inicializadas como parte do contexto dinâmico:

  • O foco de expressão, como item de contexto, posição de contexto e tamanho de contexto, é inicializado como mostrado a seguir. Observe que todos esses valores podem ser substituídos pelo método nodes().

    • O tipo de dados xml define o item de contexto, o nó sendo processado, para o nó de documento.

    • A posição de contexto, a posição do item de contexto relativo aos nós que são processados, é primeiro configurada como 1.

    • O tamanho de contexto, o número de itens na seqüência sendo processada, é primeiro definido como 1, pois sempre há um nó de documento.

Restrições de implementação

A seguir são descritas as limitações relacionadas ao contexto dinâmico:

  • Não há suporte para funções de contexto Data e hora atual, fn:current-date, fn:current-time e fn:current-dateTime.

  • O fuso horário implícito é fixado como UTC+0 e não pode ser alterado.

  • Não há suporte para a funçãofn:doc(). Todas as consultas são executas em colunas ou variáveis do tipo xml.

  • Não há suporte para a funçãofn:collection().