SQL Server renvoie «Erreur de dépassement arithmétique lors de la conversion de l'expression en type de données int.»


19

Lorsque j'exécute cette commande avec SUM()

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

Je suis en train,

Arithmetic overflow error converting expression to data type int.

Une idée sur quelle en est la cause?

Je suis juste en train de suivre les instructions de cette réponse .

Réponses:


25

Pour des valeurs supérieures au INTmaximum (2 147 483 647), vous voudrez utiliser 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;

Si cela se produit dans le SUM, vous devez vous convertir Amounten 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 ne fait pas automatiquement la promotion de int en bigint? #TIL Donc, si vous résumez cela pourrait être important, vous devez envelopper la valeur CONVERT(). Magnifique.
Evan Carroll

Comment votre exemple sur cette question a-t-il fonctionné, et le mien n'a pas fonctionné à l'époque? C'est ta réponse?
Evan Carroll

@EvanCarroll, je ne suis pas sûr! Je suppose qu'il est possible que la distribution des valeurs aléatoires soit différente et que la mienne soit suffisamment basse pour ne pas devenir a BIGINT. C'est à peu près ma meilleure estimation.
Erik Darling

@EvanCarroll J'ai écrit un dbfiddle après en avoir parlé avec Paul W. avec un exemple plus efficace, notez juste qu'il ne fonctionnera pas sur dbfiddle à cause des exigences de partitionnement: dbfiddle.uk/…
Erik Darling

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.