2012-03-07 76 views
4

我需要將帶小數的數字插入到SQL Server 2008數據庫中。看起來像decimal()是正確的數據類型,但是,我無法準確理解它。SQL Server 2008-無法理解十進制

我發現這個腳本(向下滾動十進制):

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=95322

,讓我對數字測試不同的十進制設置,有一些我不明白爲什麼他們通過或失敗。按照我的理解,當使用十進制(precision,scale)時,精度是小數點左邊的位數,scale是小數點右邊的位數。使用這個函數,我不明白爲什麼有些人會通過,爲什麼有些人失敗了。

SELECT dbo.udfIsValidDECIMAL('2511.1', 6, 3)  

我對右邊的左邊和1 4位,但這個失敗。

SELECT dbo.udfIsValidDECIMAL('10.123456789123456789', 18, 17)  
SELECT dbo.udfIsValidDECIMAL('10.123456789123456789', 18, 16) 

第一個失敗,第二個通過。小數點後有18位數字,所以它們似乎都應該失敗(或者傳遞和SQL截斷數字)。

也許我對decimal()應該如何工作有一個基本的誤解?

回答

2

精度是可以存儲的總位數。

所以小數點左邊的數字將是精度級別。

例如,你的第一個例子將失敗,因爲你只允許三個地方到小數點左邊:

SELECT dbo.udfIsValidDECIMAL('2511.1',6,3) 
1
cast(10.123456789123456789 as decimal(18,17)) 

的18 &規模的17精密允許僅有1位至小數點左邊,但在那個例子中有2個。

cast(10.123456789123456789 as decimal(18,16) 

有2位數的空間成功。

+0

因此,您必須從精度中減去比例以獲得小數點左邊的位數嗎? – Pryach 2012-03-07 17:36:04

4

DECIMAL(6,3)表示:總共6位數,小數點右邊3位。

所以你有3位數字之前,小數點後3位,當然它不能處理2511.1 - 這是四個數字在小數點左側。你需要DECIMAL(7,3)來處理。

MSDN documentation on DECIMAL

十進制[(對[,S])]和數字[(對[,S])]

P(精度)

可以存儲的最大小數位數的最大總數,小數點的左邊和右邊都可以存儲。精度 必須是從1到最大精度38的值。所述 默認精度爲18

S(刻度)

可以存儲到小數點右邊的十進制數字的最大位數。比例必須是從0到p的值。 只有在指定精度的情況下才能指定比例。默認 比例是0;因此,0 < = s < = p。最大存儲大小因精度而異,基於 。

相關問題