我试图通过100乘以0.0015由它未能为下面的错误:转换nvarchar的值“0.0015”为数据类型int时的Sql转换失败
转换失败。
Cast(([Rate]*100) AS NVARCHAR(10)) AS Rate
我试图通过100乘以0.0015由它未能为下面的错误:转换nvarchar的值“0.0015”为数据类型int时的Sql转换失败
转换失败。
Cast(([Rate]*100) AS NVARCHAR(10)) AS Rate
乘以非整数:
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;
使用Cast(([Rate] * 100.0)AS NVARCHAR(10))AS Rate返回0.00 – user7675421
@ user7675421。 。 。使用明确的'cast()'/'convert()'。有关内置转换的规则可能会产生意想不到的结果。 –
请与实际的标签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
SQL Server 2016 – user7675421
欢迎来到堆栈溢出。请注意,您可以(也应该)在需要提供更多信息时编辑问题。这次我为你做了。 –