1. 程式人生 > >將expression轉化為數據類型int時發生算術溢出錯誤

將expression轉化為數據類型int時發生算術溢出錯誤

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
  1. declare @a int
  2. , @b int
  3. , @c bigint
  4. set @a = 1000000000
  5. set @b = 2000000000
  6. --1.
  7. set @c = @a + @b
  8. --2.
  9. --set @c = cast( @a as bigint) + cast( @b as bigint)
  10. --3.
  11. --set @c = convert(numeric(20,0),@a) + convert(numeric(20,0),@b)
  12. 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時發生算術溢出錯誤