Sistema de tipos (XQuery)
Aplica-se a:SQL Server
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 http://www.w3.org/2001/XMLSchema namespace.
Tipos definidos no http://www.w3.org/2004/07/xpath-datatypes namespace.
Este tópico também descreve o seguinte:
O valor digitado contra o valor da cadeia de caracteres de um nó.
A função de dados (XQuery) e a função de cadeia de caracteres (XQuery).
Correspondendo o tipo de sequê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 tipos estáticos e dinâmicos, consulte Contexto de expressão e avaliação de consulta (XQuery). Por exemplo, a consulta a seguir é especificada em uma coluna xml tipada (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.
Tipos definidos no namespace XPath Data Types
Os tipos definidos no http://www.w3.org/2004/07/xpath-datatypes namespace 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 XQuery e são usados para XQuery e Digitação Estática. Você pode converter para os tipos atômicos, por exemplo, xdt:untypedAtomic, no namespace xdt .
Ao consultar XML não tipado, o tipo estático e dinâmico de nós de elemento é xdt:untyped e o tipo de valores de atributo é xdt:untypedAtomic. O resultado de um método query() gera XML não tipado. 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 sequê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 sequê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 tipado, o tipo do valor digitado é xdt:untypedAtomic.
Você pode usar a função data() ou string() para recuperar o valor de um nó:
A função de dados (XQuery) retorna o valor digitado de um nó.
A função de cadeia de caracteres (XQuery) retorna o valor da cadeia de caracteres do nó.
Na seguinte coleção de esquemas XML, o <root
> elemento do tipo inteiro é definido:
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 data()
função recupera os valores tipado de atributos de LaborHours
todos os <Location
> elementos de um modelo de produto. De acordo com o esquema XML associado à Instruction
coluna, 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() neste exemplo é apenas para ilustração. Se não for especificado, sum() aplicará implicitamente a função data() para extrair os valores tipados dos nós.
Consulte Também
Modelos e permissões do SQL Server Profiler
Fundamentos de XQuery