SELECT sorgusunda aritmetik taşma


9

Basit bir SELECT deyiminde aritmetik bir taşma ile karşılaştım. Sorgu aşağıdaki gibiydi örn.

SELECT [SaleValue] FROM Sales

[SaleValue]veri türündeydi decimal(9,0)ve hesaplanan sütun değil.

Bunun nedeni, bir şekilde sütunun, bu alanın belirtilen veri tipinden daha büyük bir değer sakladığı bir sıraya sahip olmasıydı, örn decimal(10,0).

Seçimi yalnızca sütunun boyutunu büyüttüğümde alabilirim. Söz konusu tabloda, diğer iki sütun ve satırda iki örnek daha bulunmaktadır.

Bu durum nasıl mümkün oldu? İlk başta sütunda aralık dışı bir değer nasıl kaydedildi?

Microsoft SQL Server kullanıyorum + bu bir temel tablo, bir görünüm değil.


1
Bunu yapmaya zorlayabileceğimin tek olası yolu, DAC aracılığıyla sistem tablolarını düzenlemek olacaktır - birinin bu DB'ye yapılıp yapılmadığını size söyleyebileceği oldukça şiddetli bir süreç. O zaman bile işe yarayacağından emin değilim (hatta mümkün olabilir). Bunun dışında, kendimiz için bu durumu görmek için gerçekten bir repro senaryosuna ihtiyacımız var ve mümkünse reproyu yaratmanın sanırım kolayca yıllarca deneyime girebileceğinden şüpheleniyorum.
Damien_The_Unbeliever

Daha da kötüsü, 9 / 10'un depolama boyutu için bir kesme noktası olduğunu hatırladım decimal- a decimal(9,0)5 bayt, decimal(10,0)9'u işgal etmelidir. her satırdaki veriler için doğru depolama boyutu.
Damien_The_Unbeliever

1
@Damien_The_Unbeliever Nasıl çoğaltılacağına dair hiçbir fikrim yok. Ne olduğunu anlamak bir saatimi aldı. Bunu görmek kuru su veya soğuk ısıyı görmek gibiydi. Dürüst olmak gerekirse, beni şaşırttı.

Yanıtlar:


15

Bu çeşitli şekillerde olabilir, örneğin SQL Server 2005 ve sonraki sürümlerinde DBCC hatası 2570 Sorunlarını Giderme bölümünde açıklandığı gibi :

Geçersiz veya aralık dışı veriler, aşağıdaki nedenlerle SQL Server veritabanında önceki sürümlerde depolanmış olabilir:

  • Bcp yardımcı programı gibi toplu ekleme yöntemleri kullanılırken kaynakta geçersiz veriler vardı.
  • Geçersiz veriler, SQL Server'a yapılan RPC olay çağrılarından geçirildi.
  • Fiziksel veri bozulmasının diğer olası nedenleri sütun değerini geçersiz bir durumda bıraktı.

Bu makale konuyla ilgili birçok yararlı bilgi içermektedir. Temel bilgiler için , özellikle belgelere DBCC CHECKDBve DATA_PURITYseçeneğe bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.