0

我正在使用类型为 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)了,但它仍然抛出错误。

4

5 回答 5

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

于 2013-06-06T15:01:20.623 回答
1

在这里试试这个:

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

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

于 2013-06-06T15:00:28.160 回答
1
CAST(CAST( value AS NUMERIC) *0.001 AS VARCHAR(100))
于 2013-06-06T15:00:31.807 回答
1

你可以;

update testTable cast(cast(value as decimal) * 0.001 as varchar(32))
于 2013-06-06T15:01:09.560 回答
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 才能使其正常工作。

于 2013-06-06T15:05:16.483 回答