Sistema de tipos (XQuery)
XQuery é uma linguagem com rigidez de tipos para esquemas digitados, e uma linguagem fraca em tipos para dados não digitados. Os tipos predefinidos de XQuery incluem o seguinte:
Tipos internos de esquema XML no namespace http://www.w3.org/2001/XMLSchema.
Tipos definidos no namespace http://www.w3.org/2004/07/xpath-datatypes.
Este tópico também descreve o seguinte:
O valor digitado contra o valor da cadeia de caracteres de um nó.
Correspondendo o tipo de seqüência retornado por uma expressão.
Tipos internos do esquema XML
Os tipos internos do esquema XML têm um prefixo de namespace predefinido de xs. Alguns desses tipos incluem xs:integer e xs:string. Há suporte para todos esses tipos internos. Você pode usar esses tipos ao criar uma coleção de esquemas XML.
Ao consultar XML digitado, o tipo estático e dinâmico dos nós é determinado pela coleção de esquemas XML associada à coluna ou variável sendo consultada. Para obter mais informações sobre os tipos estáticos e dinâmicos, consulte Contexto de expressão e avaliação de consulta (XQuery). Por exemplo, a seguinte consulta é especificada em uma coluna digitada xml (Instructions). A expressão usa instance of para verificar se o valor digitado do atributo LotSize retornado é do tipo xs:decimal.
SELECT Instructions.query('
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
data(/AWMI:root[1]/AWMI:Location[@LocationID=10][1]/@LotSize)[1] instance of xs:decimal
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
Essas informações digitadas são fornecidas pela coleção de esquemas XML associada à coluna. Para obter mais informações, consulte Representação de tipo de dados xml no banco de dados do AdventureWorks2008R2.
Tipos definidos no namespace XPath Data Types
Os tipos definidos no namespace http://www.w3.org/2004/07/xpath-datatypes têm um prefixo predefinido de xdt. O seguinte se aplica a esses tipos:
Você não pode usar esses tipos ao criar uma coleção de esquemas XML. Esses tipos são usados no sistema de tipos do XQuery e são utilizados para XQuery e digitação estática. Você pode fazer conversão para tipos atômicos, por exemplo, xdt:untypedAtomic, no namespace xdt.
Ao consultar um XML não digitado, o tipo estático e dinâmico dos nós de elemento é xdt:untyped e o tipo de valores de atributos é xdt:untypedAtomic. O resultado de um método query() gera um XML não digitado. Isso significa que os nós XML são retornados como xdt:untyped e xdt:untypedAtomic, respectivamente.
Não há suporte para os tipos xdt:dayTimeDuration e xdt:yearMonthDuration.
No exemplo a seguir, a consulta é especificada em uma coluna XML não digitada. A expressão, data(/a[1]), retorna uma seqüência de um valor atômico. A função data() retorna o valor digitado do elemento <a>. Como o XML sendo consultado não é digitado, o tipo do valor retornado é xdt:untypedAtomic. Portanto, instance of retorna true.
DECLARE @x xml
SET @x='<a>20</a>'
SELECT @x.query( 'data(/a[1]) instance of xdt:untypedAtomic' )
Em vez de recuperar o valor digitado, a expressão (/a[1]) no exemplo a seguir retorna uma seqüência de um elemento, o elemento <a>. A expressão instance of usa o teste de elemento para verificar se o valor retornado pela expressão é um nó de elemento xdt:untyped type.
DECLARE @x xml
SET @x='<a>20</a>'
-- Is this an element node whose name is "a" and type is xdt:untyped.
SELECT @x.query( '/a[1] instance of element(a, xdt:untyped?)')
-- Is this an element node of type xdt:untyped.
SELECT @x.query( '/a[1] instance of element(*, xdt:untyped?)')
-- Is this an element node?
SELECT @x.query( '/a[1] instance of element()')
Observação |
---|
Quando você está consultando uma instância XML digitada e a expressão de consulta inclui o eixo pai, as informações do tipo estática dos nós resultantes não estarão mais disponíveis. Porém, o tipo dinâmico ainda está associado com os nós. |
Valor digitado x valor da cadeia de caracteres
Todo nó tem um valor digitado e um valor de cadeia de caracteres. Para os dados XML digitados, o tipo do valor digitado é fornecido pela coleção de esquemas XML associada à coluna ou variável sendo consultada. Para dados XML não digitados, o tipo do valor digitado é xdt:untypedAtomic.
Você pode usar a função data() ou string() para recuperar o valor de um nó:
O Função data (XQuery) retorna o valor digitado de um nó.
A Função string (XQuery) retorna o valor da cadeia de caracteres de um nó.
Na coleção de esquemas XML a seguir, o elemento <root> do tipo inteiro é definida:
CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="root" type="integer"/>
</schema>'
GO
No exemplo a seguir, a expressão primeiro recupera o valor digitado de /root[1] e depois adiciona 3 a ela.
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('data(/root[1]) + 3')
No próximo exemplo, a expressão falha, pois a string(/root[1]) na expressão retorna um valor do tipo de cadeia de caracteres. Esse valor é então passado para um operador aritmético que só considera valores de tipo numéricos como seus operandos.
-- Fails because the argument is string type (must be numeric primitive type).
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('string(/root[1]) + 3')
O exemplo a seguir calcula o total dos atributos de LaborHours. A função data() recupera os valores digitados dos atributos de LaborHours de todos os elementos <Location> de um modelo de produto. De acordo com o esquema XML associado à coluna Instruction, o atributo LaborHours é do tipo xs:decimal.
SELECT Instructions.query('
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
sum(data(//AWMI:Location/@LaborHours))
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
Essa consulta retorna 12.75 como resultado.
Observação |
---|
O uso explícito da função data() nesse exemplo, serve apenas para ilustração. Se não for especificada, sum() aplicará implicitamente a função data() para extrair os valores digitados dos nós. |