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:
Análise de consulta.
Resolução dos nomes de tipo e função especificados na expressão.
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)