SQL Server, "ifadeyi veri türü int'e dönüştüren aritmetik taşma hatası" döndürür.


19

Bu komutu ile çalıştırdığımda SUM()

SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

Ben alıyorum,

Arithmetic overflow error converting expression to data type int.

Sebebi nedir?

Ben sadece bu cevaptaki talimatları takip ediyorum .

Yanıtlar:


25

INTMaks . Değerden ( 2,147,483,647) büyük değerler için COUNT_BIG (*) kullanmak istersiniz .

SELECT COUNT_BIG(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

Eğer oluyorsa, a SUMdönüştürmeniz gerekir .AmountBIGINT

SELECT COUNT(*) AS [Records], SUM(CONVERT(BIGINT, t.Amount)) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

2
SQL Server int'den bigint'e otomatik olarak tanıtım yapmıyor mu? #TIL Eğer bigint olabileceğini özetliyorsanız , değeri girmeniz gerekir CONVERT(). Güzel.
Evan Carroll

Bu sorudaki örneğiniz nasıl çalıştı ve benimki o zaman işe yaramadı? Bu senin cevabın mı?
Evan Carroll

@EvanCarroll Emin değilim! Rastgele değer dağılımının farklı olabileceğini ve benim olmamak için yeterince düşük eğilmiş olduğunu düşünüyorum BIGINT. Bu benim en iyi tahminim hakkında.
Erik Darling

@EvanCarroll Daha etkili bir örnekle Paul W. ile konuştuktan sonra bir dbfiddle yazdım, sadece bölümleme gereksinimleri nedeniyle dbfiddle üzerinde çalışmayacağını unutmayın: dbfiddle.uk/…
Erik Darling

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.