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:

Este tópico também descreve o seguinte:

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çãoObservaçã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ó:

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çãoObservaçã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.

Consulte também

Outros recursos