Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
O seguinte diagrama de especificações W3C XQuery 1.0 e XPath 2.0 Functions and Operators mostra os tipos de dados internos. Isso inclui os tipos primitivos e derivados internos.
Este tópico descreve as regras de transmissão de tipo que são aplicadas ao transmitir de um tipo para outro usando um dos seguintes métodos:
Transmissão explícita que você faz usando cast como ou as funções do construtor type (por exemplo,
xs:integer("5")).Fundição implícita que ocorre durante a promoção de tipo
Casting explícito
A tabela a seguir descreve a conversão de tipo permitida entre os tipos primitivos internos.
Um tipo primitivo interno pode ser convertido para outro tipo primitivo interno, com base nas regras da tabela.
Um tipo primitivo pode ser convertido para qualquer tipo derivado desse tipo primitivo. Por exemplo, você pode converter de xs:decimal para xs:integerou de xs:decimal para xs:long.
Um tipo derivado pode ser convertido para qualquer tipo que seja seu ancestral na hierarquia de tipos, até seu tipo base primitivo interno. Por exemplo, você pode converter de xs:token para xs:normalizedString ou para xs:string.
Um tipo derivado pode ser convertido para um tipo primitivo se seu ancestral primitivo pode ser convertido para o tipo de destino. Por exemplo, você pode converter xs:inteiro, um tipo derivado, para um xs:string, tipo primitivo, porque xs:decimal, xs:integerancestral primitivo do , pode ser convertido para xs:string.
Um tipo derivado pode ser convertido para outro tipo derivado se o ancestral primitivo do tipo de origem puder ser convertido para o ancestral primitivo do tipo de destino. Por exemplo, você pode converter de xs:inteiro para xs:token, porque você pode converter de xs:decimal para xs:string.
As regras para transmitir tipos definidos pelo usuário para tipos internos são as mesmas que para os tipos internos. Por exemplo, você pode definir um tipo de myInteger derivado de tipo de xs:integer. Em seguida, myInteger pode ser convertido para xs:token, porque xs:decimal pode ser convertido para xs:string.
Os seguintes tipos de fundição não são suportados:
Não é permitida a transmissão de ou para tipos de lista. Isso inclui tipos de lista definidos pelo usuário e tipos de lista internos, como xs:IDREFS, xs:ENTITIESe xs:NMTOKENS.
Não há suporte para transmissão de ou para xs:QName.
xs:NOTATION e os subtipos totalmente ordenados de duration, xdt:yearMonthDuration e xdt:dayTimeDuration, não são suportados. Como resultado, a transmissão para ou a partir desses tipos não é suportada.
Os exemplos a seguir ilustram a conversão explícita de tipos.
Exemplo A
O exemplo a seguir consulta uma variável de tipo xml. A consulta retorna uma sequência de um valor de tipo simples digitado como xs:string.
declare @x xml
set @x = '<e>1</e><e>2</e>'
select @x.query('/e[1] cast as xs:string?')
go
Exemplo B
O exemplo a seguir consulta uma variável xml digitada. O exemplo primeiro cria uma coleção de esquema XML. Em seguida, ele usa a coleção de esquema XML para criar uma variável xml digitada. O esquema fornece as informações de digitação para a instância XML atribuída à variável. As consultas são então especificadas em relação à variável.
create xml schema collection myCollection as N'
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="A" type="xs:string"/>
<xs:element name="B" type="xs:string"/>
<xs:element name="C" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>'
go
A consulta a seguir retorna um erro estático, porque você não sabe quantos elementos de <root> de nível superior estão na instância do documento.
declare @x xml(myCollection)
set @x = '<root><A>1</A><B>2</B><C>3</C></root>
<root><A>4</A><B>5</B><C>6</baz></C>'
select @x.query('/root/A cast as xs:string?')
go
Ao especificar um elemento <root> singleton na expressão, a consulta é bem-sucedida. A consulta retorna uma sequência de um valor de tipo simples digitado como xs:string.
declare @x xml(myCollection)
set @x = '<root><A>1</A><B>2</B><C>3</C></root>
<root><A>4</A><B>5</B><C>6</C></root>'
select @x.query('/root[1]/A cast as xs:string?')
go
No exemplo a seguir, a variável de tipo xml inclui uma palavra-chave document que especifica a coleção de esquema XML. Isso indica que a instância XML deve ser um documento que tenha um único elemento de nível superior. Se você criar dois elementos <root> na instância XML, ele retornará um erro.
declare @x xml(document myCollection)
set @x = '<root><A>1</A><B>2</B><C>3</C></root>
<root><A>4</A><B>5</B><C>6</C></root>'
go
Você pode alterar a instância para incluir apenas um elemento de nível superior e a consulta funciona. Novamente, a consulta retorna uma sequência de um valor de tipo simples digitado como xs:string.
declare @x xml(document myCollection)
set @x = '<root><A>1</A><B>2</B><C>3</C></root>'
select @x.query('/root/A cast as xs:string?')
go
Fundição implícita
A fundição implícita é permitida apenas para tipos numéricos e tipos atômicos não tipados. Por exemplo, a seguinte função min() retorna o mínimo dos dois valores:
min(xs:integer("1"), xs:double("1.1"))
Neste exemplo, os dois valores passados para a função XQuery min() são de tipos diferentes. Portanto, a conversão implícita é realizada onde tipo inteiro é promovido a duplo e os dois valores de duplo são comparados.
A promoção de tipo, conforme descrito neste exemplo, segue estas regras:
Um tipo numérico derivado embutido pode ser promovido para seu tipo base. Por exemplo, inteiro pode ser promovido a decimal.
Um decimal pode ser promovido a flutuador , e um flutuador pode ser promovido a duplo.
Como a transmissão implícita é permitida apenas para tipos numéricos, o seguinte não é permitido:
Não é permitida a transmissão implícita para tipos de cadeia de caracteres. Por exemplo, se dois tipos de de cadeia de caracteres forem esperados e você passar uma de cadeia de caracteres e um token , nenhuma transmissão implícita ocorrerá e um erro será retornado.
Não é permitida a transmissão implícita de tipos numéricos para tipos de cadeia de caracteres. Por exemplo, se você passar um valor de tipo inteiro para uma função que está esperando um parâmetro de tipo de cadeia de caracteres, nenhuma transmissão implícita ocorrerá e um erro será retornado.
Valores de fundição
Ao transmitir de um tipo para outro, os valores reais são transformados do espaço de valor do tipo de origem para o espaço de valor do tipo de destino. Por exemplo, a conversão de um xs:decimal para um xs:double transformará o valor decimal em um valor duplo.
Seguem-se algumas das regras de transformação.
Transmitindo um valor de uma cadeia de caracteres ou tipo atômico não tipado
O valor que está sendo convertido para uma cadeia de caracteres ou tipo atômico não tipado é transformado da mesma maneira que validar o valor com base nas regras do tipo de destino. Isso inclui eventuais regras de processamento de padrões e espaços em branco. Por exemplo, o seguinte terá êxito e gerará um valor duplo, 1.1e0:
xs:double("1.1")
Ao transmitir para tipos binários como xs:base64Binary ou xs:hexBinary a partir de uma string ou untypedAtomic typed, os valores de entrada devem ser codificados em base64 ou hexadecimal, respectivamente.
Convertendo um valor para uma cadeia de caracteres ou tipo atômico não tipado
A conversão para uma cadeia de caracteres ou tipo atômico não tipado transforma o valor em sua representação lexical canônica XQuery. Especificamente, isso pode significar que um valor que pode ter obedecido a um padrão específico ou outra restrição durante a entrada não será representado de acordo com essa restrição. Para informar os usuários sobre isso, o SQL Server sinaliza tipos em que a restrição de tipo pode ser um problema, fornecendo um aviso quando esses tipos são carregados na coleção de esquemas.
Ao converter um valor do tipo xs:float ou xs:double, ou qualquer um de seus subtipos, para uma cadeia de caracteres ou tipo atômico não tipado, o valor é representado em notação científica. Isso é feito somente quando o valor absoluto do valor é menor que 1.0E-6, ou maior ou igual a 1.0E6. Isso significa que 0 é serializado em notação científica para 0.0E0.
Por exemplo, xs:string(1.11e1) retornará o valor da cadeia de caracteres "11.1", enquanto xs:string(-0.00000000002e0) retornará o valor da cadeia de caracteres, "-2.0E-11".
Ao transmitir tipos binários, como xs:base64Binary ou xs:hexBinary, para uma cadeia de caracteres ou tipo atômico não tipado, os valores binários serão representados em sua forma codificada em base64 ou hexadecimal, respectivamente.
Convertendo um valor para um tipo numérico
Ao converter um valor de um tipo numérico para um valor de outro tipo numérico, o valor é mapeado de um espaço de valor para o outro sem passar pela serialização de cadeia de caracteres. Se o valor não satisfizer a restrição de um tipo de destino, aplicam-se as seguintes regras:
Se o valor de origem já for numérico e o tipo de destino for xs:float ou um subtipo dele que permita valores -INF ou INF, e a conversão do valor numérico de origem resultaria em um estouro, o valor será mapeado para INF se o valor for positivo ou -INF se o valor for negativo. Se o tipo de destino não permitir INF ou -INF e ocorrer um estouro, a conversão falhará e o resultado nesta versão do SQL Server será a sequência vazia.
Se o valor de origem já for numérico e o tipo de destino for um tipo numérico que inclua 0, -0e0 ou 0e0 em seu intervalo de valores aceito, e a conversão do valor numérico de origem resultará em um fluxo inferior, o valor será mapeado das seguintes maneiras:
O valor é mapeado para 0 para um tipo de destino decimal.
O valor é mapeado para -0e0 quando o valor é um fluxo inferior negativo.
O valor é mapeado para 0e0 quando o valor é um fluxo inferior positivo para um tipo de destino flutuante ou duplo.
Se o tipo de destino não incluir zero em seu espaço de valor, a conversão falhará e o resultado será a sequência vazia.
Observe que a conversão de um valor para um tipo de ponto flutuante binário, como xs:float, xs:double ou qualquer um de seus subtipos, pode perder a precisão.
Limitações de implementação
Estas são as limitações:
O valor de ponto flutuante NaN não é suportado.
Os valores caestáveis são restritos pelas restrições de implementação dos tipos de destino. Por exemplo, não é possível converter uma cadeia de caracteres de data com um ano negativo para xs:date. Essas versões resultarão na sequência vazia se o valor for fornecido em tempo de execução (em vez de gerar um erro em tempo de execução).