Estouro aritmético na consulta SELECT

9

Encontrei um estouro aritmético em uma instrução SELECT simples. A consulta foi como abaixo, por exemplo

SELECT [SaleValue] FROM Sales

[SaleValue]era do tipo de dados decimal(9,0)e não uma coluna computada.

O motivo disso aconteceu porque, de alguma forma, a coluna tinha uma linha em que esse campo estava armazenando um valor MAIS GRANDE que o tipo de dados especificado, por exemplo decimal(10,0).

Só consegui que o select funcionasse quando aumentava o tamanho da coluna. A tabela em questão possui outras duas instâncias em outras duas colunas e linhas.

Como essa situação foi possível? Como um valor fora do intervalo foi salvo na coluna em primeiro lugar?

Estou usando o Microsoft SQL Server + esta é uma tabela base, não uma exibição.


fonte
11
A única maneira possível de pensar em forçar isso a acontecer seria editar as tabelas do sistema por meio do DAC - um processo bastante violento que alguém esperaria poder dizer se foi feito com esse banco de dados. Mesmo assim, não tenho certeza de que daria certo (ou até seria possível). Fora isso, realmente precisamos de um script de reprodução para ver essa situação por nós mesmos e suspeito que criar a reprodução, se possível, poderia facilmente levar anos de experimentação.
Damien_The_Unbeliever
Pior ainda, lembrei que 9/10 é um ponto de transição para o tamanho de armazenamento de decimal- um decimal(9,0)deve ocupar 5 bytes, um decimal(10,0)9. Portanto, acho que é menos provável que você possa fazer isso editando as tabelas do sistema, pois não terá o tamanho de armazenamento correto para os dados em cada linha.
Damien_The_Unbeliever 28/08
11
@Damien_The_Unbeliever Não tem idéia de como se reproduzir. Levei uma hora para descobrir o que aconteceu. Vê-lo era como ver água seca ou calor frio. Honestamente, isso me deixou perplexo.

Respostas:

15

Isso pode acontecer de várias maneiras, por exemplo, conforme descrito em Solucionando problemas de erro DBCC 2570 no SQL Server 2005 e versões posteriores :

Dados inválidos ou fora do intervalo podem ter sido armazenados no banco de dados do SQL Server em versões anteriores pelos seguintes motivos:

  • Dados inválidos estavam presentes na origem durante o uso de métodos de inserção em massa, como o utilitário bcp.
  • Dados inválidos foram passados ​​pelas chamadas de evento RPC feitas para o SQL Server.
  • Outras causas potenciais de corrupção de dados físicos deixaram o valor da coluna em um estado inválido.

Esse artigo contém muitas informações úteis sobre o tópico. Para o básico, consulte a documentação DBCC CHECKDBe a DATA_PURITYopção em particular.

Paul White 9
fonte