2017-06-22 85 views
0

我試圖通過100乘以0.0015由它未能爲下面的錯誤:轉換nvarchar的值「0.0015」爲數據類型int時的Sql轉換失敗

轉換失敗。

Cast(([Rate]*100) AS NVARCHAR(10)) AS Rate 
+0

請與實際的標籤RDBMS(產品和版本),請閱讀[如何問一個好的SQL問題](http://meta.stackoverflow.com/questions/271055/tips-for-asking-a-good-structured-query-language-sql - 問題/ 271056)和[如何創建一個MCVE](http://stackoverflow.com/help/ MCVE)。在這種情況下,我很確定你的'[Rate]'列不是數字類型。你應該將這個'[Rate]'存儲在'DECIMAL(10,6)'中。你可以試試CAST([Rate] AS DECIMAL(10,6))* 100.0'。如果這樣做,你應該真的改變你的表的模式... – Shnugo

+0

SQL Server 2016 – user7675421

+0

歡迎來到堆棧溢出。請注意,您可以(也應該)在需要提供更多信息時編輯問題。這次我爲你做了。 –

回答

1

乘以非整數:

Cast(([Rate]*100.0) AS NVARCHAR(10)) AS Rate 

然而,這與使用由常數指定的位數小數將投rate!非常好奇這個結果:

select '0.26' * 100.0, '0.26' * 100.00 

第一列是30!如預期的那樣,第二個是26。

或者使用顯式類型轉換:

Cast(cast([Rate] as decimal(18, 4)) * 100 AS NVARCHAR(10)) AS Rate 

或者,更好的是,數據類型更改爲適當的數據類型:

alter t alter column rate decimal(18, 4); -- or whatever 

寓意是什麼?使用適當的數據類型存儲值。

編輯:

您的代碼中可能有問題的值。使用try_convert()try_cast()

try_convert(varchar(10), try_convert(decimal(18, 4), Rate) * 100) as Rate 

(我切換到varchar()因爲數字一般不需要國家字符集。)

要找到有問題的值:

select rate 
from t 
where try_convert(decimal(18, 4), rate) is null; 
+0

使用Cast(([Rate] * 100.0)AS NVARCHAR(10))AS Rate返回0.00 – user7675421

+0

@ user7675421。 。 。使用明確的'cast()'/'convert()'。有關內置轉換的規則可能會產生意想不到的結果。 –