我正在使用一个带有'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)
,但它仍然会抛出错误。
答案 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才能使其正常工作。