SQL Server restituisce "Errore di overflow aritmetico durante la conversione dell'espressione in tipo di dati int."


19

Quando eseguo questo comando con SUM()

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

Sto ricevendo

Arithmetic overflow error converting expression to data type int.

Qualche idea su quale sia la causa?

Sto solo seguendo le istruzioni in questa risposta .

Risposte:


25

Per valori superiori al INTmassimo (2.147.483.647), ti consigliamo di utilizzare COUNT_BIG (*).

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

Se sta succedendo in SUM, devi convertirlo Amountin a BIGINT.

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 non promuove automaticamente da int a bigint? #TIL Quindi, se stai sommando questo potrebbe essere un grosso problema, devi avvolgere il valore CONVERT(). Bellissimo.
Evan Carroll,

Come ha funzionato il tuo esempio su quella domanda e il mio non ha funzionato allora? È la tua risposta?
Evan Carroll,

@EvanCarroll Non ne sono sicuro! Suppongo sia possibile che la distribuzione casuale del valore fosse diversa e che la mia sia stata inclinata abbastanza in basso da non diventare a BIGINT. Questa è la mia ipotesi migliore però.
Erik Darling,

@EvanCarroll Ho scritto un dbfiddle dopo averne parlato con Paul W. con un esempio più efficiente, basta notare che non funzionerà su dbfiddle a causa dei requisiti di partizionamento: dbfiddle.uk/…
Erik Darling,

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.