Contexto de expressão e avaliação de consulta (XQuery)
Aplica-se a:SQL Server
O contexto de uma expressão é a informação que é usada para analisá-la e avaliá-la. Seguem-se as duas fases em que o XQuery é avaliado:
Contexto estático - Esta é a fase de compilação da consulta. Com base nas informações disponíveis, por vezes são gerados erros durante esta análise estática da consulta.
Contexto dinâmico - Esta é a fase de execução da consulta. Mesmo que uma consulta não tenha erros estáticos, como erros durante a compilação da consulta, a consulta pode retornar erros durante sua execução.
Contexto estático
A inicialização do 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 é concluído:
A política de de espaço em branco de limite de está definida para ser removida. Portanto, o espaço em branco do limite não é preservado pelo qualquer elemento e atributo construtores na consulta. Por exemplo:
declare @x xml set @x='' select @x.query('<a> {"Hello"} </a>, <b> {"Hello2"} </b>')
Essa consulta retorna o seguinte resultado, porque o espaço de limite é removido 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.
Quaisquer namespaces definidos usando WITH XMLNAMESPACES. Para obter mais informações, consulte Adicionar namespaces a consultas com WITH XMLNAMESPACES).
Quaisquer namespaces definidos no prólogo de consulta. Observe que as declarações de namespace no prolog podem substituir a declaração de namespace no WITH XMLNAMESPACES. Por exemplo, na consulta a seguir, WITH XMLNAMESPACES declara um prefixo (pd) que o vincula ao namespace (
https://someURI
). No entanto, na cláusula WHERE, o prolog de consulta substitui a ligaçã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 do contexto estático.
Se consultar uma coluna ou variável de xml digitada, os componentes da coleção de esquema 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 tipado.
Para cada tipo atômico nos esquemas importados, uma função de fundição também é disponibilizada no contexto estático. Isso é ilustrado no exemplo a seguir. Neste exemplo, uma consulta é especificada em relação a uma variável de xml digitada. A coleção de esquema XML associada a essa variável define um tipo atômico, myType. Correspondente a este tipo, uma função de fundiçã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 transmissão para o int tipo XML interno é 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 consultas.
Resolvendo os nomes de função e tipo especificados na expressão.
Digitação estática da consulta. Isso garante que a consulta seja segura para digitação. Por exemplo, a consulta a seguir retorna um erro estático, porque o operador + requer argumentos de tipo primitivo numérico:
declare @x xml set @x='' SELECT @x.query('"x" + 4')
No exemplo a seguir, o value() operador requer um singleton. Conforme especificado no esquema XML, pode haver vários elementos <Elem>. A análise estática da expressão determina que ela não é segura e um erro estático é retornado. Para resolver o erro, a expressão deve ser reescrita para especificar explicitamente um singleton (
data(/x:Elem)[1]
).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 Static Typing.
Restrições de implementação
Seguem-se as limitações relacionadas com o contexto estático:
O modo de compatibilidade XPath não é suportado.
Para construção XML, apenas o modo de construção de faixa é suportado. 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 tipo.
Apenas o modo de encomenda ordenada é suportado.
Somente a política de espaço XML strip é suportada.
A funcionalidade de URI de base não é suportada.
fn:doc() não é suportada.
fn:collection() não é suportada.
XQuery sinalizador estático não é fornecido.
O agrupamento associado ao xml tipo de dados é usado. Esse agrupamento é sempre definido como o agrupamento de pontos de código Unicode.
Contexto dinâmico
Contexto dinâmico refere-se às informações que devem estar disponíveis no momento em que a expressão é executada. Além do contexto estático, as seguintes informações são inicializadas como parte do contexto dinâmico:
O foco da expressão, como o item de contexto, a posição do contexto e o tamanho do contexto, é inicializado conforme 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 em relação aos nós que estão sendo processados, é definida primeiro como 1.
O tamanho do contexto, o número de itens na sequência que está sendo processada, é primeiro definido como 1, porque sempre há um nó de documento.
Restrições de implementação
Seguem-se as limitações relacionadas com o contexto dinâmico:
Não há suporte para as funções de contexto data e hora atuais fn:current-date, fn:current-timee fn:current-dateTime, .
O de fuso horário implícito é corrigido para 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 xml tipo.
A função fn:collection() não é suportada.
Ver também
Noções básicas do XQuery
Comparar XML digitado com XML não tipado
coleções de esquema XML (SQL Server)