2012-10-31 31 views
6

下面是我正在使用的那種表結構和數據的子集。將varchar轉換爲數據類型數值的算術溢出錯誤。 '10'<= 9.00

CREATE TABLE #Test 
(
    Val varchar(5) 
    ,Type varchar(5) 
) 

INSERT #Test VALUES ('Yes','Text') 
INSERT #Test VALUES ('10','Int') 
INSERT #Test VALUES ('10.00','Float') 
INSERT #Test VALUES ('9.00','Float') 
INSERT #Test VALUES ('9','Int') 

我想編寫一個查詢,讓我知道,如果列「瓦爾」是< = 9.00(必須是數字數據類型)。我做了以下操作:

SELECT * 
FROM 
    (
     SELECT Val 
     FROM #Test 
     WHERE Type = 'Int' 
    ) IntsOnly 
WHERE IntsOnly.Val <= 9.00 

這給了我一個算術溢出錯誤。但是,如果我排除的數據行,其值爲「10」:

SELECT * 
FROM 
    (
     SELECT Val 
     FROM #Test 
     WHERE Type = 'Int' 
     AND Val <> '10' 
    ) IntsOnly 
WHERE IntsOnly.Val <= 9.00 

這工作沒有任何問題。 我的問題不是如何解決這個問題,因爲我知道我可以簡單地將數據轉換爲我需要的格式。

我的問題是爲什麼'Val'列'10'的值返回錯誤。當然,邏輯應該返回'False',並簡單地排除這些行,因爲'10'(我假設是隱式轉換的)大於9.00。

謝謝。

+1

算術溢出錯誤,你確定嗎?不是[轉換錯誤](http://stackoverflow.com/q/9136722/11683)? – GSerg

+0

嘗試在轉換中顯式***。 CAST(val AS DECIMAL(9,2))<= CAST(9.00 AS DECIMAL(9,2))給出了什麼? – MatBailie

+0

GSerg - 是的,算術溢出將varchar轉換爲數字。德姆斯 - 這確實有用!但是,我想了解爲什麼隱式轉換不起作用?我的想法是,它可以做這種轉換,不應該引起問題? – JBond

回答

9

這,因爲它試圖到Val柱隱含轉換成一個NUMERIC(3,2),這自然將溢出像10.

它使用NUMERIC 2位數的值(3產生算術溢出,2)作爲目標類型和大小,因爲這是9.00似乎適合的最小數字。

當然,解決方案是使用顯式CASTing而不是隱式執行

+0

另外我注意到的是,讓我們說你有一個'十進制(5,3)'和你有的數字是'12.321'將被接受。但是,如果你的號碼是'123.321' < - 總共是6位數',所以不會接受它。你的小數應該是「十進制(6,3)」。這只是我已經測試並證實自己'SQL 2014' – Pierre

+2

@Pierre是的,這實際上只是'DECIMAL'數據類型規範的定義。 – RBarryYoung

4

BOL

在Transact-SQL語句,以小數點的常數被自動轉換成一個數字數據值,使用最小的精度和必要的規模。例如,恆定12.345被轉換成一個數字值爲5的精度和3.

分這意味着您的恆定9.00將具有 1:1的精度和0 的精度的尺度3,刻度爲2,因此它不能存儲值10,這需要2 + scale的最小精度。

您需要將IntsOnly.Val換成CASTCONVERT以指定正確的精度和比例。

+0

我確定你打算寫2的比例? –

+0

這取決於SQL引擎的聰明程度;它可以轉換爲數字(3,2),因爲小數點後有兩位數字,或者可以轉換爲數字(1,0),因爲小數點後面的數字都是「0」 。 –

+0

它查看小數點右側的所有零,但忽略了左側的所有前導零。所以'00000.0000'給''數字(4,4)' –

相關問題