2012-08-30 32 views
6

這個很簡單。爲什麼下面的代碼會導致下面的錯誤?十進制(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 documentationdecimal(p, s)p(或10在我的情況)是十進制數字的「最大總數可存儲,都向左和右邊的小數點「,而s(或9在我的情況下)是」最大可存儲的小數位數到右邊的d小點「。

我的號碼,50,僅具有2位總(其小於最大 10)和0位小數的權(其是小於所述最大 9),因此它應該工作。

我發現this question關於本質上相同的問題,但沒有人解釋爲什麼文檔似乎與行爲衝突。這似乎是s尺寸實際上被解釋爲固定小數點右邊的位數,並且p中減去,在我的情況下,它保留10-9 =僅剩1位數處理左側。

任何人都可以提供一種合理的方式來解釋文檔以符合行爲?

編輯:

我看到下面的一些解釋,但他們不與文檔的措辭解決的根本問題。我建議在措辭這種變化:

爲「P(精)」改變「的小數位數的最大總數可存儲」閱讀「的小數位數的最大總數存儲」 。

併爲「s(比例)」更改「可存儲在小數點右側的最大小數位數」。 「存儲在小數點右側的小數位數,該數值從p減去以確定小數點左邊的最大位數。」

我打算向連接提交一個錯誤報告,除非有人有更好的解釋。

+0

MS回覆了我的錯誤報告,現在已經按照我的建議更新了SQL Server 2012的文檔。請參閱https://connect.microsoft.com/SQLServer/feedback/details/760495/。拿那個,downvoters! :P –

回答

5

我提交了一個bug報告到Connect:Misleading documentation on the decimal data type

+1

哦,對於那些投票給我的人,請仔細閱讀。上述兩位專家都在他們的回答下面的評論中承認這是文檔中的錯誤或遺漏。這不是我第一次在MSDN中發現錯誤,其中的準確措辭與語言的行爲不匹配。最後一次只是在幾個月前,Jon Skeet不僅同意,而且MS員工幫助推送了關於Connect的錯誤報告,並且修改了文檔:http://stackoverflow.com/questions/9689839/msdn -documentation錯誤 - 如果最過程的是,共享所有的局部變量-A。 –

+2

MS回覆了我的錯誤報告,現在已經按照我的建議更新了SQL Server 2012的文檔。 https://connect.microsoft.com/SQLServer/feedback/details/760495/。拿這個,downvoters :-) –

+1

我upvoting否定一些downvotes,因爲文檔*是*錯了,原來的問題和這個答案是正確的指出。 –

10

10 - 9是1. DECIMAL(10, 9)可以容納格式爲0.000000000的數字。 50在小數點前有兩位數字,因此超出範圍。你自己引用它:

According to the MSDN documentation on decimal(p, s), p (or 10 in my case) is the "maximum total number of decimal digits that can be stored, both to the left and to the right of the decimal point" whereas s (or 9 in my case) is the "maximum number of decimal digits that can be stored to the right of the decimal point."

+2

「DECIMAL(10,9)可以保存格式爲0.000000000的數字。」從文檔中得到的結果如何?它不會談論從* p *中減去* s *,它會討論總共可以存儲的*最大*數字,以及右邊的數字。由於右側沒有50,因此應該在左側使用剩餘的10個*總數*位。 –

+0

@JordanRieger:不,你指定精度是9左邊,所以它會在左邊9和右邊1。它沒有變化。 – Ryan

+1

我認爲你的意思是9 * * *。文檔在哪裏說(10,9)意味着右邊總是有* 9位數字?它只說最右邊的*最大值是9. –

2

一個合理的方式來詮釋的文檔是尾隨小數零個數字不容忽視。所以你的數字在小數點右邊有9個十進制數字,它們全都是0

+0

不可以,因爲可能會有無限的尾隨零位數。有什麼可以說數字「50」有9或999尾隨零? –

+0

「DECIMAL(p,s)」類型中的's'參數指定該表示中確切存儲了多少個尾隨數字。 –

+0

不,根據文檔,它指定*最大*後續數字的數量。請理解,我並不質疑SQL Server的行爲,而是質疑文檔的措辭。 –

1

DECIMAL(10, 9)是一個固定的精度和比例數值數據類型。這意味着它總是在小數點右側存儲相同數量的數字。因此,您指定的數據類型只能使用存儲小數點左邊的一位數字和右邊的9位數字。顯然,50不適合這種格式。

1

圍棋雖然下面的鏈接。 http://msdn.microsoft.com/en-gb/library/ms190476.aspx

精度是一個數字中的位數。比例是數字中小數點右側的位數。例如,數字123.45的精度爲5,刻度爲2.

+0

不幸的是,定義與http://msdn.microsoft.com/en-us/library/ms187746(v=sql.110).aspx,它使用單詞「最大」,這就是爲什麼兩個單獨的微軟員工接受我的原因衝突提交以更改誤導性文檔。請參閱https://connect.microsoft.com/SQLServer/feedback/details/760495/misleading-documentation-on-the-decimal-data-type。他們所需要做的就是刪除「最大」一詞,並在「s」定義中將「can」更改爲「will」,並添加我在原始問題中提到的另一個句子。看起來他們還沒有得到它:) –

相關問題