Compartilhar via


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

Aplica-se: SQL Server

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 política de espaço em branco de limite é definida como strip. Portanto, o espaço em branco de limite não é preservado pelos construtores de qualquer elemento e atributo 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 Adicionar namespaces a consultas com 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 (https://someURI). Entretanto, na cláusula WHERE, o prólogo da consulta substitui a associação.

      WITH XMLNAMESPACES ('https://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 estiver consultando uma coluna ou variável xml digitada, os componentes da coleção de esquemas XML associados à coluna ou variável serão importados para o contexto estático. Para obter mais informações, consulte Comparar XML digitado 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. Neste exemplo, uma consulta é especificada em relação a uma variável xml tipada. A coleção de esquemas XML associada a essa variável define um tipo atômico, myType. Correspondente a esse tipo, uma função de conversão, myType(), está disponível durante a análise estática. 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 para o 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 numéricos de tipo primitivo:

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

    No exemplo a seguir, o operador value() requer um singleton. Conforme 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 tipagem 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. Esta é a configuração padrão. Portanto, o tipo do nó do 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 política de espaço de tira XML.

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

  • fn:doc() não é suportado.

  • fn:collection() não é suportado.

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

  • A ordenação associada ao tipo de dados xml é usada. Esta ordenação sempre é definida como ordenação 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ó que está sendo processado, para o nó do 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 sequê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:

  • As funções de contexto de data e hora atuais, fn:current-date, fn:current-time e fn:current-dateTime, não são suportadas.

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

  • A função fn:doc() não é suportada. Todas as consultas são executadas em colunas ou variáveis do tipo xml .

  • A função fn:collection() não é suportada.

Confira também

Fundamentos de XQuery
Comparar XML tipado com XML não tipado
Coleções de esquema XML (SQL Server)