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:
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 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().
Consulte também