Sistema de tipo (XQuery)
Aplica-se a:SQL Server
XQuery é uma linguagem fortemente tipada para tipos de esquema e uma linguagem fracamente tipada para dados não tipados. 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 versus 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 ao tipo de sequência retornado por uma expressão.
Tipos internos de esquema XML
Os tipos internos de esquema XML têm um prefixo de namespace predefinido de xs. Alguns desses tipos incluem xs:integer e xs:string. Todos esses tipos integrados são suportados. Você pode usar esses tipos ao criar uma coleção de esquema XML.
Ao consultar XML digitado, o tipo estático e dinâmico dos nós é determinado pela coleção de esquema XML associada à coluna ou variável que está sendo consultada. Para obter mais informações sobre tipos estáticos e dinâmicos, consulte Expression Context and Query Evaluation (XQuery). Por exemplo, a consulta a seguir é especificada em relação a uma coluna de xml digitada (Instructions
). A expressão usa instance of
para verificar se o valor digitado do atributo LotSize
retornado é de xs:decimal
tipo.
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 de digitação são fornecidas pela coleção de esquema XML associada à coluna.
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 aplica-se a estes tipos:
Não é possível usar esses tipos ao criar uma coleção de esquema XML. Esses tipos são usados no sistema de tipo XQuery e são usados para XQuery e Static Typing. 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:untypede o tipo de valores de atributo é xdt:untypedAtomic. O resultado de um método query() gera XML sem tipo. Isso significa que os nós XML são retornados como xdt:untyped e xdt:untypedAtomic, respectivamente.
Os xdt:dayTimeDuration e tipos de xdt:yearMonthDuration não são suportados.
No exemplo a seguir, a consulta é especificada em relação a uma variável XML sem tipo. 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 que está sendo consultado não é tipado, 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, 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 de 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 tipada e a expressão de consulta inclui o eixo pai, as informações de tipo estático dos nós resultantes não estão mais disponíveis. No entanto, o tipo dinâmico ainda está associado aos nós.
Valor digitado vs. Valor da cadeia de caracteres
Cada nó tem um valor digitado e um valor de cadeia de caracteres. Para dados XML tipados, o tipo do valor digitado é fornecido pela coleção de esquema XML associada à coluna ou variável que está sendo consultada. Para dados XML não tipados, o tipo do valor digitado é xdt:untypedAtomic.
Você pode usar o data() ou função string() para recuperar o valor de um nó:
O de função de dados (XQuery) retorna o valor digitado de um nó.
O de função de cadeia de caracteres (XQuery) retorna o valor da cadeia de caracteres do nó.
Na seguinte coleção de esquema XML, o elemento <root
> 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, em seguida, adiciona 3
a ele.
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('data(/root[1]) + 3')
No exemplo seguinte, a expressão falha, porque o string(/root[1])
na expressão retorna um valor de tipo de cadeia de caracteres. Esse valor é então passado para um operador aritmético que usa apenas valores de tipo numérico 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 LaborHours
. A função data()
recupera os valores digitados de atributos LaborHours
de todos os elementos <Location
> para um modelo de produto.
De acordo com o esquema XML associado à coluna Instruction
, LaborHours
é do tipo xs:decimal tipo.
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
Esta 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() aplica implicitamente a função data() para extrair os valores digitados dos nós.
Ver também
Modelos e permissões do SQL Server Profiler
Noções básicas do XQuery