2011-08-29 111 views
2

我面對我的SQL腳本錯誤:算術溢出錯誤轉換數字數據類型數字

算術溢出錯誤轉換數字數據類型數字

select x.MemberName,x.DOB,x.FilePath,x.Medication,x.NDC,x.Directions,x.Name,x.Strength,x.GenericName,x.QtyOrdered,x.DaysSupply,x.DateFilled, 
CASE 
    WHEN x.test = 0 THEN 'N/A' 
    WHEN compliance > 100.0 THEN '100.0' 
    ELSE CONVERT(VARCHAR(5), CAST(FLOOR(compliance *10)/10.0 AS DECIMAL(3,1))) 
END as [Compliance] 

我對着上面的語法行錯誤。

+0

列合規性保持什麼值? –

+0

它具有'N/A','100.0'或'99.1'等值,即它具有浮動和nvarchar – goofyui

回答

5

這是你的問題:

declare @compliance decimal(10,5) 

set @compliance = 100.0 -- <---------------- 

select CAST(FLOOR(@compliance *10)/10.0 AS DECIMAL(3,1)) 

拋出「算術溢出錯誤轉換數字數據類型數字」的錯誤。更改爲DECIMAL(4,1)作品,或@paola表明,你的條件更改爲>= 100.0

decimal(p,s): 

P(精度)是將 存儲的十進制數字的最大總數,同時向左側和小數點右側。所述 精度必須是從1的值通過38 最大精度默認精度爲18

S(比例)是將要存儲到小數點的右邊 小數的位數。將該數字從p中減去 確定小數點左邊的最大位數 。

在你的情況decimal(3, 1)指共3位與1位小數點的右邊,

99.9 

decimal(4,1)共4位用1位提供的權小數點,

999.9 
+0

@Compliance必須同時接受NVARCHAR和FLOAT。即)如果沒有合規......我們需要將其設置爲N/A – goofyui

+0

我不建議以其他方式。 –

+1

@Chok,我認爲Mitch是對的,您可能需要將您的第二個案例更改爲'WHEN compliance> = 100.0'(注意=>) –

3

這個問題已經回答了,但爲什麼是很重要的。

數字定義了TOTAL位數,然後是小數點後的數字。

的十進制(4,1)顯示123.4 DECIMAL(4,3)顯示1.234

在你一共有4位兩種情況。在一種情況下,小數點後面有1,小數點前面留3。反之亦然。

+0

除了問題只使用十進制(3,1).... –

相關問題