将列类型从浮点型转换为字符串型的 SQL

9
我正在尝试将表中的一个列从 Float(空)更改为 Varchar(25)(空)。当前数据中最大的浮点数为12位,但未来可能需要添加更多位,因此使用varchar(25)。该列目前存储电话号码。修改后可以支持前导零。
不过,我在进行操作时遇到了一些困难。
我已经尝试了以下方法:
ALTER TABLE Customer 
ALTER COLUMN Phonenumber varchar(25)

这不能给我所需的结果。

例如,1549779498 变成了 1.54978e+009

然后我尝试了以下操作:

  • 创建一个新的(临时)列 PhonenumberVarchar
  • 将数据从一列转换并复制到另一列
  • 删除旧列
  • 将新列重命名为旧名称

代码:

ALTER TABLE Customer 
ADD PhonenumberVarchar varchar(25)

UPDATE Customer 
SET PhonenumberVarchar = STR(Phonenumber, 12, 0)

ALTER TABLE Customer 
DROP COLUMN Phonenumber

EXEC sp_rename 'Customer.PhonenumberVarchar', 'Phonenumber', 'COLUMN'

这个也不起作用:

子查询返回了多个值。当子查询跟随 =,!=,<,< =,>或> = 时,不允许使用此操作,或者当子查询被用作表达式时。

现在时间已经很晚了,我的头非常痛......

有人可以帮忙吗?

注意:

该表相当庞大,约有150万行,因此性能可能是一个问题。

使用SQL Server。

3个回答

12

您可以通过先经过 decimal 来解决这个问题:

ALTER TABLE Customer ALTER COLUMN Phonenumber decimal(25, 0);
ALTER TABLE Customer ALTER COLUMN Phonenumber varchar(25);

使用cast()时,您会获得相同的行为:

select cast(cast(1549779498 as float) as varchar(255))

因此,修复操作的演示如下:

select cast(cast(cast(1549779498 as float) as decimal(25)) as varchar(255))

alter table alter column中的文档明确提到了cast():

某些数据类型更改可能会导致数据更改。例如,将nchar或nvarchar列更改为char或varchar可能导致扩展字符的转换。有关更多信息,请参阅CAST和CONVERT(Transact-SQL)。减少列的精度或比例可能会导致数据截断。

编辑:

在加载数据后,我建议您还添加一个检查约束:

check (PhoneNumber not like '%[^0-9]%')

这将确保未来该列中只有数字 - 且仅有数字。


这似乎是可行的。所以如果我理解正确,使用十进制转换的技巧首先是要确保使用 nvarchar 直接获取的舍入误差被消除? - user2110298
1
@user2110298……是的,虽然我不确定它们是否完全是舍入误差。用于转换的表示形式并非您想要的,这是解决该问题的相对简单的方法。 - Gordon Linoff

0

将浮点数直接转换为字符型可能会很棘手。仅更改列数据类型是不够的。

步骤1:备份您的数据表。

SELECT * INTO Customer_Backup FROM Customer

第二步:使用 SQL Server 脚本删除并创建原始数据表 // 或者 // 删除和修改列的数据类型

ALTER TABLE Customer 
ALTER COLUMN Phonenumber varchar(25)

步骤3:在您的情况下,由于电话号码在浮点列中没有小数数据值,因此我们可以先将其转换为整数,然后再像下面一样转换为varchar

INSERT into Customer (Phonenumber) 
SELECT convert (varchar(25), convert(int, [Phonenumber])) as [Phonenumber]
FROM Customer_Backup

-1
ALTER TABLE Customer  ADD PhonenumberVarchar  VARCHAR(25)

GO

UPDATE Customer  SET PhonenumberVarchar  = str  (Phonenumber,12,0)

ALTER TABLE Phonenumber  ALTER COLUMN Phonenumber  VARCHAR(25)

UPDATE Customer  SET Phonenumber = PhonenumberVarchar 

ALTER TABLE Customer  DROP COLUMN PhonenumberVarchar 

使用这段代码仍然会得到原帖中描述的错误。 - user2110298

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接