Overflow aritmetico su query SELECT


9

Ho riscontrato un overflow aritmetico in una semplice istruzione SELECT. La query era come sotto es

SELECT [SaleValue] FROM Sales

[SaleValue]era di tipo dati decimal(9,0)e non una colonna calcolata.

Il motivo è stato perché in qualche modo la colonna aveva una riga in cui questo campo memorizzava un valore MAGGIORE rispetto al tipo di dati specificato, ad es decimal(10,0).

Ho potuto far funzionare la selezione solo quando ho aumentato le dimensioni della colonna. La tabella in questione ha altre due istanze in altre due colonne e righe.

Come è stata possibile questa situazione? Come è stato innanzitutto salvato un valore fuori intervallo nella colonna?

Sto usando Microsoft SQL Server + questa è una tabella di base, non una vista.


1
L'unico modo possibile che mi viene in mente di forzare questo accada sarebbe quello di modificare le tabelle di sistema tramite il DAC, un processo abbastanza violento che qualcuno spera sia in grado di dirti se fosse stato fatto su questo DB. Anche allora non sono sicuro che funzionerebbe per niente bene (o addirittura sarebbe possibile). A parte ciò, abbiamo davvero bisogno di una sceneggiatura per vedere questa situazione da soli e sospetto che la creazione della riproduzione, se possibile, potrebbe facilmente richiedere anni di sperimentazione.
Damien_The_Unbeliever,

Ancora peggio, ho appena ricordato che il 9/10 è un punto di ritaglio per la dimensione della memoria di decimal- un decimal(9,0)dovrebbe occupare 5 byte, un decimal(10,0)9. Quindi penso che sia meno probabile che tu possa farlo modificando le tabelle di sistema poiché non avrai la dimensione di archiviazione corretta per i dati in ogni riga.
Damien_The_Unbeliever,

1
@Damien_The_Unbeliever Non hai idea di come riprodurre. Mi ci è voluta un'ora per capire cosa è successo. Vederlo era come vedere acqua secca o caldo freddo. Onestamente, mi ha lasciato perplesso.

Risposte:


15

Ciò può accadere in diversi modi, ad esempio come descritto nella risoluzione dei problemi dell'errore DBCC 2570 in SQL Server 2005 e versioni successive :

Dati non validi o fuori portata potrebbero essere stati archiviati nel database di SQL Server nelle versioni precedenti per i seguenti motivi:

  • Nell'origine erano presenti dati non validi durante l'utilizzo di metodi di inserimento di massa, come l'utilità bcp.
  • Dati non validi sono stati passati attraverso le chiamate di eventi RPC effettuate a SQL Server.
  • Altre potenziali cause di corruzione dei dati fisici hanno lasciato il valore della colonna in uno stato non valido.

Quell'articolo contiene molte informazioni utili sull'argomento. Per le nozioni di base, consultare la documentazione DBCC CHECKDBe l' DATA_PURITYopzione in particolare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.