將expression轉化為數據類型int時發生算術溢出錯誤
阿新 • • 發佈:2018-06-04
HR article bar all CA lar 都在 ast blog
在SQL Server 中,某列的數據都在int範圍之內,但是使用sum聚集函數求該列和的時候,出現“將expression轉化為數據類型int時發生算術溢出錯誤”。
問題在於定義的數據類型:
首先,我們先看看SQL Server 定義的數據類型的長度:
- bigint 數據類型存儲從 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 範圍內的數字。存儲大小為 8 個字節。
- int 數據類型的存儲範圍是 -2,147,483,648 至 2,147,483,647(每個值需 4 個字節的存儲空間)。
- smallint 數據類型的存儲範圍只有 -32,768 至 32,767(每個值需 2 個字節的存儲空間),tinyint 數據類型只能存儲 0 至 255 範圍內的數字(每個值需 1 個字節的存儲空間)。
當我們對int類型的數據做sum操作的時候,就有可能發生算術溢出的問題。此時,我們可以采用在做sum操作前,將原有列的數據類型更改為bigint 。
SQL 語句:
1. select sum(cast(colName as bigint)) from TableName
2. select sum(convert(numeric(20,0),colName)) from TableName
以上兩種方法都是可以的。
在SQL Server 2005 中,我進行了測試:
[xhtml] view plain copy
- declare @a int
- , @b int
- , @c bigint
- set @a = 1000000000
- set @b = 2000000000
- --1.
- set @c = @a + @b
- --2.
- --set @c = cast( @a as bigint) + cast( @b as bigint)
- --3.
- --set @c = convert(numeric(20,0),@a) + convert(numeric(20,0),@b)
- select @c
使用方法1,雖然定義@c為bigint 類型,但是 仍然會出現“Arithmetic overflow error converting expression to data type int.” 錯誤。
通過方法2 和方法3 ,均可以得到最後結果為 3000000000
轉自:https://blog.csdn.net/spring21st/article/details/5345338
將expression轉化為數據類型int時發生算術溢出錯誤