Sql-Server
算術溢出錯誤
如果我執行此程式碼:
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
. 當結果不合適時,可能會引發錯誤(取決於設置)。當其中一個文字使用
CAST
或CONVERT
作為(例如)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)**