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
A especificação W3C permite que erros de tipo sejam gerados estática ou dinamicamente e define erros estáticos, dinâmicos e de tipo.
Compilação e tratamento de erros
Os erros de compilação são retornados de expressões e XML DML instruções Xquery sintaticamente incorretas. A fase de compilação verifica a correção do tipo estático de expressões XQuery e instruções DML e usa esquemas XML para inferências de tipo para XML tipado. Ele gera erros de tipo estático se uma expressão pode falhar em tempo de execução devido a uma violação de segurança de tipo. Exemplos de erro estático são a adição de uma cadeia de caracteres a um inteiro e a consulta de um nó inexistente para dados digitados.
Como um desvio do padrão W3C, os erros de tempo de execução do XQuery são convertidos em sequências vazias. Essas sequências podem se propagar como XML vazio ou NULL para o resultado da consulta, dependendo do contexto de invocação.
A conversão explícita para o tipo correto permite que os usuários contornem erros estáticos, embora os erros de conversão em tempo de execução sejam transformados em sequências vazias.
Observação
Os erros de análise gerados pelo analisador XQuery (como erros de sintaxe no XML referenciado como parte do método de tipo de dados XML, por exemplo), anulam a transação ativa, independentemente da configuração de XACT_ABORT da sessão atual.
Erros estáticos
Os erros estáticos são retornados usando o mecanismo de erro Transact-SQL. No SQL Server, os erros de tipo XQuery são retornados estaticamente. Para obter mais informações, consulte XQuery e Static Typing.
Erros dinâmicos
No XQuery, a maioria dos erros dinâmicos são mapeados para uma sequência vazia ("()"). No entanto, estas são as duas exceções: condições de estouro nas funções do agregador XQuery e erros de validação XML-DML. A maioria dos erros dinâmicos são mapeados para uma sequência vazia. Caso contrário, a execução de consultas que aproveita os índices XML pode gerar erros inesperados. Portanto, para fornecer uma execução eficiente sem gerar erros inesperados, o Mecanismo de Banco de Dados do SQL Server mapeia erros dinâmicos para ().
Frequentemente, na situação em que o erro dinâmico ocorreria dentro de um predicado, não gerar o erro não é alterar a semântica, porque () é mapeado para False. No entanto, em alguns casos, retornar () em vez de um erro dinâmico pode causar resultados inesperados. Seguem-se exemplos que ilustram esta situação.
Exemplo: Usando a função avg() com uma cadeia de caracteres
No exemplo a seguir, a função Avg é chamada para calcular a média dos três valores. Um desses valores é uma cadeia de caracteres. Como a instância XML neste caso não é tipada, todos os dados nela são do tipo atômico não tipado. A função avg() primeiro projeta esses valores para xs:double antes de calcular a média. No entanto, o valor, "Hello", não pode ser convertido para xs:double e cria um erro dinâmico. Nesse caso, em vez de retornar um erro dinâmico, a conversão de "Hello" para xs:double causa uma sequência vazia. A função avg() ignora esse valor, calcula a média dos outros dois valores e retorna 150.
DECLARE @x xml
SET @x=N'<root xmlns:myNS="test">
<a>100</a>
<b>200</b>
<c>Hello</c>
</root>'
SELECT @x.query('avg(//*)')
Exemplo: Usando a função not
Quando você usa a função Não em um predicado, por exemplo, /SomeNode[not(Expression)]e a expressão causa um erro dinâmico, uma sequência vazia será retornada em vez de um erro. Aplicar not() à sequência vazia retorna True, em vez de um erro.
Exemplo: Transmitindo uma cadeia de caracteres
No exemplo a seguir, a cadeia de caracteres literal "NaN" é convertida em xs:string, depois em xs:double. O resultado é um conjunto de linhas vazio. Embora a string "NaN" não possa ser convertida com êxito para xs:double, isso não pode ser determinado até o tempo de execução porque a string é convertida pela primeira vez em xs:string.
DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double(xs:string("NaN")) ')
GO
Neste exemplo, no entanto, ocorre um erro de tipo estático.
DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double("NaN") ')
GO
Limitações de implementação
A função fn:error() não é suportada.
Conteúdo relacionado
- de referência de linguagem XQuery (SQL Server)
- Noções básicas do XQuery