Sql-Server

算術溢出錯誤

  • October 7, 2016

如果我執行此程式碼:

select 99999 * 9999

結果 = 999890001

如果我執行此程式碼:

select 9999923 * 99999999

結果:

消息 8115,級別 16,狀態 2,第 1

行將表達式轉換為數據類型 int 的算術溢出錯誤。

如果我執行以下程式碼:

select 922337299987987689745893 * 999999994564

結果 = 922337294974162127011191918541325652

為什麼我會在特定範圍內收到此算術溢出錯誤?

SQL Server 用於派生文字類型的規則很複雜,現在為了向後兼容而維護了一些奇怪的行為。例如,派生類型可能取決於是否應用了簡單參數化。還有其他(未記錄的)考慮因素。

排除了這些警告後,您面臨的情況就是最簡單的情況之一。無類型文字的類型是根據integer它們何時適合該數據類型。結果的數據類型在* (Multiply) (Transact-SQL)中指定:

返回具有較高優先級的參數的數據類型。

有關詳細資訊,請參閱數據類型優先級 (Transact-SQL)

這兩種數據類型都是integer(顯然具有相同的優先級),因此結果也被鍵入為integer. 當結果不合適時,可能會引發錯誤(取決於設置)。

當其中一個文字使用CASTCONVERT作為(例如)bigint(其優先級高於integer)顯式鍵入時,結果類型將為bigint,並且不會發生錯誤。

問題中兩個較大的常數分別輸入為numeric(24,0)numeric(12,0)。將它們相乘的結果numeric(37,0)按照精度、比例和長度 (Transact-SQL)e1 * e2中所示的規則鍵入:

結果精度:p1 + p2 + 1 = 24 + 12 + 1 = **37**
結果比例:s1 + s2 = 0 + 0 = **0**

結果類型:**數字(37,0)**

引用自:https://dba.stackexchange.com/questions/151691