2013-02-27 21 views
1

在列[Return rate],我有這樣的值:會將文本或VARCHAR到十進制類型

20.0% 
17.1% 
etc 

在我的詢問,我想在計算中使用此值。

因此,首先,我由一個空字符串''更換'%'

REPLACE([Return Rate], '%' ,'') AS [Test] 

這工作,我得到這樣的'20 0.0' 時,[收益率]是'20 1.0%的價值觀。

然後我嘗試在計算中使用此[測試]值,例如:

(REPLACE([Return Rate], '%' ,'') * 10) AS [Test] 

但我在邏輯上得到一個錯誤,所以我嘗試這個文本值轉換爲執行我的計算:

CAST (REPLACE([Current Xelus FE Return Rate], '%' ,'') AS decimal(2,1)) [Decimal Test] 

而且它在這裏我得到的錯誤:

Arithmetic overflow error converting varchar to data type numeric. 
Warning: Null value is eliminated by an aggregate or other SET operation. 

有別人的答案,這個錯誤? 非常感謝,

回答

0

如果您的任何行包含空值,您將會收到此錯誤。嘗試一個ISNULL,像這樣:

CAST( 
IsNull( 
    REPLACE([Current Xelus FE Return Rate], '%' ,'') 
, '0.0') 
AS decimal(5,1)) [Decimal Test] 

如果您的數據包含非數值(如你所提到的一樣, 'N/A' 值),您可以使用則IsNumeric()函數elimimate他們

CAST( 
    CASE WHEN IsNumeric(
    IsNull( 
     REPLACE([Current Xelus FE Return Rate], '%' ,'') 
    , '0.0') 
) = 1 THEN IsNull(REPLACE([Current Xelus FE Return Rate], '%' ,''),'0.0') 
    ELSE '0.0' 
    END 
AS decimal(5,1)) [Decimal Test] 
+0

謝謝大家,但似乎NULL值和其他(如'N/A')是造成這個問題的原因。 有人知道如果有一個SQL或T-SQL函數來驗證參數中的值是否是數值嗎? (例如,我可以爲「N/A」等值)做一個特例。 – lour 2013-02-27 14:24:56

-1

嘗試澆鑄成FLOAT - 十進制(2,1)是不夠的:

CAST (REPLACE([Current Xelus FE Return Rate], '%' ,'') AS FLOAT) 

那麼你應該能夠做進一步的計算

CAST (REPLACE([Current Xelus FE Return Rate], '%' ,'') AS FLOAT) * 10 
+0

如果您計劃使用計算,則不應使用浮點數,否則會出現舍入誤差。 – HLGEM 2013-02-27 15:15:28