使用float转换更改varchar列中的值

时间:2013-06-06 14:56:38

标签: sql-server

我正在使用一个带有'value'列的表,其类型为varchar(100)。 必须通过将它们乘以0.001来更改该列中的所有值,但由于“将varchar转换为数字类型时出现算术溢出错误”,我的后续更新脚本将失败。

update testTable
  set value = cast ((value * 0.001) as varchar);

我不能更改列的类型,它的值保持在0到4294966796之间。

如何正确投射以使更新中的计算有效?

我尝试了cast (cast ((value * 0.001)) as float) as varchar),但它仍然会抛出错误。

5 个答案:

答案 0 :(得分:1)

这里试试这个:

update testTable
  set value = cast ((cast(value as float) * 0.001) as varchar);

如果仍然失败,则其中一行具有非数字值

答案 1 :(得分:1)

CAST(CAST( value AS NUMERIC) *0.001 AS VARCHAR(100))

答案 2 :(得分:1)

你可以;

update testTable cast(cast(value as decimal) * 0.001 as varchar(32))

答案 3 :(得分:1)

单程

update testTable
  set value = convert(float,value) * 0.001

一个可以运行的简单示例

DECLARE @z varchar(100)
SELECT @z = CONVERT(float,'123') * 0.001

SELECT @z

0.123

答案 4 :(得分:0)

如果您的值超过浮点数的大小,那么您可以将算术作为字符串。这是一种特殊情况,因为乘以0.001只是将小数位移到左边的三个位置。以下适用于大于1000的值,包含或不包含小数位:

update testTable
    set value = (case when charindex('.', value) = 0
                      then left(value, len(value) - 3)+'.'+right(value, 3)
                      else left(value, charidnex('.', value) - 3) + '.' +
                           replace(right(value, len(value) - charindex('.', value) + 4), '.', '')
                 end)

如果您的值小于100,那么您需要在值前加上0才能使其正常工作。