Msg 8115 Arithmetic overflow error

Ha a webalkalmazásunkba feltöltött fájlokról SQL táblában tárolunk meta információkat, akkor általában a fájl méretét tároló oszlopnál beérjük a klasszikus int adattípussal. Az int T-SQL-ben 4 bájtos, tehát nagyjából 2 GB-os fájlok leírására lesz így képes az alkalmazásunk, ennél nagyobbat nem szoktak feltölteni a felhasználók. Ha jól megy az webhely és a felhasználók töltögetnek rendesen, akkor egy idő után azonban könnyen belefuthatunk ebbe a hibaüzenetbe:

  Msg 8115, Level 16, State 2, Line 12
  Arithmetic overflow error converting expression to data type int.

Az egészben az az érdekes, hogy egy olyan utasításról van szó, ami korábban működött, most viszont elröppen. A hibaüzenetben a kulcsszó az overflow, azaz kiléptünk az int határaiból. Ez hogyan fordulhat elő? Például úgy, hogy a kódban van egy ehhez hasonló utasítás:

  SELECT Sum(FileSize) FROM...

Ez egészen addig nem fog gondot okozni, amíg az összes fájl együttes mérete el nem éri a 2GB-ot. Tehát nem egy fájl a gond, hanem az összes együtt! A Sumot ugyanis ha inttel etetjük, akkor intet is akar kiköpni magából, de ha az eredmény nem fér bele az int értéktartományába, hanem megakad a torkán.

A megoldás nagyon egyszerű, durvuljunk:

  SELECT SUM(CAST(FileSize AS bigint)) FROM...

Csak az a kár, hogy előre kellene gondolni rá…

Technorati-címkék: ,
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s