這個很簡單。爲什麼下面的代碼會導致下面的錯誤?十進制(10,9)變量不能包含數字50(SQL Server 2008)
declare @dTest decimal(10, 9)
set @dTest = 50
錯誤:
Msg 8115, Level 16, State 8, Line 3
Arithmetic overflow error converting int to data type numeric.
按照MSDN documentation上decimal(p, s)
,p
(或10在我的情況)是十進制數字的「最大總數可存儲,都向左和右邊的小數點「,而s
(或9在我的情況下)是」最大可存儲的小數位數到右邊的d小點「。
我的號碼,50,僅具有2位總(其小於最大 10)和0位小數的權(其是小於所述最大 9),因此它應該工作。
我發現this question關於本質上相同的問題,但沒有人解釋爲什麼文檔似乎與行爲衝突。這似乎是s
尺寸實際上被解釋爲固定小數點右邊的位數,並且從p中減去,在我的情況下,它保留10-9 =僅剩1位數處理左側。
任何人都可以提供一種合理的方式來解釋文檔以符合行爲?
編輯:
我看到下面的一些解釋,但他們不與文檔的措辭解決的根本問題。我建議在措辭這種變化:
爲「P(精)」改變「的小數位數的最大總數可存儲」閱讀「的小數位數的最大總數將存儲」 。
併爲「s(比例)」更改「可存儲在小數點右側的最大小數位數」。 「將存儲在小數點右側的小數位數,該數值從p減去以確定小數點左邊的最大位數。」
我打算向連接提交一個錯誤報告,除非有人有更好的解釋。
MS回覆了我的錯誤報告,現在已經按照我的建議更新了SQL Server 2012的文檔。請參閱https://connect.microsoft.com/SQLServer/feedback/details/760495/。拿那個,downvoters! :P –