Overflow aritmatika pada kueri SELECT

9

Saya menemukan aritmatika melimpah dalam pernyataan SELECT sederhana. Kueri itu seperti di bawah ini misalnya

SELECT [SaleValue] FROM Sales

[SaleValue]adalah tipe data decimal(9,0)dan bukan kolom yang dihitung.

Alasan ini terjadi adalah karena entah bagaimana kolom memiliki baris di mana bidang ini menyimpan nilai yang LEBIH BESAR dari tipe data tertentu, misalnya decimal(10,0).

Saya hanya bisa mendapatkan pilih untuk bekerja ketika saya meningkatkan ukuran kolom. Tabel tersebut memiliki dua instance lain dalam dua kolom dan baris lainnya.

Bagaimana situasi ini mungkin? Bagaimana nilai di luar rentang disimpan di kolom pada awalnya?

Saya menggunakan Microsoft SQL server + ini adalah tabel dasar, bukan tampilan.


sumber
1
Satu-satunya cara yang mungkin saya pikirkan untuk memaksa hal ini terjadi adalah dengan mengedit tabel sistem melalui DAC - proses yang cukup keras yang diharapkan seseorang dapat memberi tahu Anda jika telah dilakukan pada DB ini. Bahkan kemudian saya tidak yakin itu akan berhasil dengan baik (atau bahkan mungkin). Di luar itu, kita benar-benar membutuhkan skrip repro untuk melihat situasi ini untuk diri kita sendiri dan saya curiga membuat repro, jika mungkin, dapat dengan mudah memakan waktu bertahun-tahun eksperimen.
Damien_The_Unbeliever
Lebih buruk lagi, hanya ingat bahwa 9/10 adalah titik cutover untuk ukuran penyimpanan decimal- a decimal(9,0)harus menempati 5 byte, decimal(10,0)9. Jadi saya pikir itu kurang mungkin bahwa Anda bisa melakukan ini dengan mengedit tabel sistem karena Anda tidak akan memiliki ukuran penyimpanan yang benar untuk data di setiap baris.
Damien_The_Unbeliever
1
@Damien_The_Unbeliever Tidak tahu cara mereproduksi. Butuh satu jam untuk mencari tahu apa yang terjadi. Melihatnya seperti melihat air kering atau panas dingin. Jujur, itu membuat saya bingung.

Jawaban:

15

Ini bisa terjadi dalam beberapa cara, misalnya seperti yang dijelaskan dalam Pemecahan masalah DBCC kesalahan 2570 di SQL Server 2005 dan versi yang lebih baru :

Data yang tidak valid atau di luar jangkauan mungkin telah disimpan dalam database SQL Server di versi sebelumnya karena alasan berikut:

  • Data tidak valid ada di sumber saat menggunakan metode penyisipan massal, seperti utilitas bcp.
  • Data tidak valid diteruskan melalui panggilan acara RPC yang dibuat ke SQL Server.
  • Penyebab potensial lain dari korupsi data fisik meninggalkan nilai kolom dalam keadaan tidak valid.

Artikel itu berisi banyak informasi berguna tentang topik tersebut. Untuk dasar-dasarnya, lihat dokumentasi untuk DBCC CHECKDBdan DATA_PURITYopsi khususnya.

Paul White 9
sumber