Tratamento de erros (XQuery)

A especificação de W3C permite que erros de tipo ocorram estática ou dinamicamente, e define erros de tipo, dinâmicos e estáticos.

Compilação e tratamento de erros

Erros de compilação são retornados de expressões Xquery sintaticamente incorretas e instruções XML DML. A fase de compilação verifica a exatidão do tipo estático das expressões XQuery e instruções DML, e usa esquemas XML para inferências de tipo para XML digitado. Erros do tipo estático ocorrem se uma expressão puder falhar no tempo de execução em razão de uma violação de segurança de tipo. Os exemplos de erro estático são: adição de uma cadeia de caracteres a um número inteiro e consulta de um nó inexistente para dados digitados.

Como uma divergência do padrão de W3C, os erros em tempo de execução Xquery são convertidos em seqüências vazias. Essas seqüências podem se propagar como XML vazio ou NULL no resultado da consulta, dependendo do contexto da invocação.

Uma conversão explícita para o tipo correto permite aos usuários solucionar erros estáticos, embora erros de tempo de execução lançados sejam transformados em seqüências vazias.

Erros estáticos

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 digitação estática.

Erros dinâmicos

No XQuery, a maioria dos erros dinâmicos são mapeados para uma seqüência vazia ("()"). Entretanto, estas são as duas exceções: condições de estouro nas funções de agregador do XQuery e validação de erros XML-DML. Observe que a maioria dos erros dinâmicos é mapeada para uma seqüência vazia. Caso contrário, a execução da consulta que se beneficia dos índices XML pode causar erros inesperados. Portanto, para prover uma execução eficiente sem gerar erros inesperados, o Mecanismo de banco de dados do SQL Server mapeia erros dinâmicos para ().

Freqüentemente, na situação em que o erro dinâmico aconteceria dentro de um predicado, não causar o erro não é alterar as semânticas, porque () é mapeado para False. No entanto, em alguns casos, retornando () em vez de um erro dinâmico pode causar resultados inesperados. Os exemplos a seguir ilustram isso.

Exemplo: usando a função avg () com uma cadeia de caracteres

No exemplo a seguir, a função avg é chamada para computar a média dos três valores. Um desses valores é uma cadeia de caracteres. Em razão da instância XML nesse caso não ser digitada, todos os dados nela são de um tipo atômico não digitado. A função avg() converte primeiro esses valores em xs:double antes de computar a média. Entretanto, o valor "Hello" não pode ser convertido em xs:double e cria um erro dinâmico. Nesse caso, em vez de retornar um erro dinâmico, a conversão de "Hello" em xs:double causa uma seqüê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 not em um predicado, por exemplo, /SomeNode[not(Expression)], e a expressão causa um erro dinâmico, uma seqüência vazia será retornada em vez de um erro. Aplicando not() à seqüência vazia retorna True, em vez de um erro.

Exemplo: convertendo 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 cadeia de caracteres "NaN" não possa ser convertida em xs:double com sucesso, isso não pode ser determinado até que a cadeia de caracteres seja convertida primeiro em xs:string.

DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double(xs:string("NaN")) ')
GO

Neste exemplo, contudo, acontece um erro de tipo estático.

DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double("NaN") ')
GO

Limitações de implementação

Não há suporte para a funçãofn:error().