22 Nisan 2008 Salı

Arithmetic overflow error converting numeric to data type numeric.

HATA MESAJI:
"Arithmetic overflow error converting numeric to data type numeric."

AÇIKLAMA:
Bu hata mesajını DECIMAL, NUMERIC gibi veri tiplerini kullanarak işlemler yaptığınızda alabilirsiniz.

Hatanın nedeni ise, yapılan işlemler sonucu ortaya çıkan sayının aktarılacağı değişkenin veri tipi ayarının doğru yapılandırılmamasıdır.

Bir örnekle anlatayım. Örnekte üç adet değişken tanımlıyorum. Birinci değişken "A", herhangi bir sayı, ikinci değişken "B", bu da herhangi bir sayı, üçüncü değişken ise, "A" ve "B" değişkenlerinin toplamının aktarılacağı "Sonuc" isimli değişken. "A" ve "B" değişkenlerine birer sayı atadıktan sonra, "A" ve "B" değişkenlerine atadığım sayıların sonucunu toplama işlemiyle "Sonuc" değişkenine aktarıyorum.

DECLARE @A NUMERIC(26, 6)
DECLARE @B NUMERIC(26, 6)
DECLARE @Sonuc NUMERIC(26, 6)

SET @A = 98765432109876543210.123456
SET @B = 98765432109876543210.123456
SELECT @Sonuc = (@A + @B)

SELECT @Sonuc

Bu işlem sonucunda "Arithmetic overflow error converting numeric to data type numeric." hatası ile karşılaşırım.

Bu sorunu daha iyi anlatabilmek adına, bilmeyen arkadaşlar için "NUMERIC(26, 6)" nın ne anlama geldiğinden de çok kısaca bahsedeyim. Parantez içerisindeki 26 sayısı, Numeric veri tipiyle belirlenen değişkenin içine virgülün sağındaki ve solundaki topram rakam sayısıdır. Bu amaç için en fazla 38 sayısı kullanılabilir. Parantezin içerisinde ve virgülün sağında bulunan 6 sayısı ise, Numeric veri tipinde olan değişkenin içerisindeki sayının ondalık kısmındaki sayı uzunluğunu verir. Örnek olarak "SET @A" komutuyla "A" değişkenine atadığım ondalık kesirli sayıya bakabilirsiniz. Noktanın solunda tam 20 adet rakam vardır, sağında ise 6 adet. Toplamda 26 adet. 27 olursa, bu hata ile karşılaşırsınız.

ÇÖZÜM:
Çözüme de yukarıdaki örnekten devam ederek ulaşacağım.

Bizim bu işlem sonucunda da bu hata ile karşılaşmamızın sebebi, sonucumuzun 27 rakamdan oluşan bir sayı olarak çıkmasıdır. Yani "A" ve "B" değişkenlerinin toplamı 27 adet rakamdan oluşan bir sayıyı kapsamaktadır. Eğer örneğimizdeki "Sonuc" değişkenini DECLARE komutu ile tanımlarken NUMERIC(27,6) şeklinde tanımlarsak, o zaman sonuç hatasız şekilde alınabilecektir.

DECLARE @Sonuc NUMERIC(27, 6)

şeklinde.

3 yorum:

Onder Arslan dedi ki...

26 sayısının tüm rakamların toplam sayısı olduğunu bilmiyordum, virgülün solundakiler 26 sağındakiler 6 gibi bir çıkarım yapmıştım. 1 saattir koddaki hatamı bulmaya çalışıyordum. Teşekkürler bu yararlı bilgi için.

Adsız dedi ki...

Hocam çok teşekkür ederim

servetcyr dedi ki...

Teşekürler,