SQL将列类型从float转换为varchar

use*_*298 7 sql sql-server sql-types copy

我正在尝试将表中的列中的数据类型从Float(null)更改为Varchar(25)(null).当前数据中最大的浮点数是12位数,但将来可能需要添加更多的数字varchar(25).

该列中的当前数据是电话号码.必须进行更改以允许前面的零.

但是,我在这方面遇到了一些困难.

我尝试过以下方法:

ALTER TABLE Customer 
ALTER COLUMN Phonenumber varchar(25)
Run Code Online (Sandbox Code Playgroud)

这并没有给我想要的结果.

例如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'
Run Code Online (Sandbox Code Playgroud)

这也不起作用:

子查询返回的值超过1.当子查询跟随=,!=,<,<=,>,> =或子查询用作表达式时,不允许这样做.

而现在已经很晚了,我的头疼...

有人可以帮忙吗?

注意:

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

使用SQL Server.

Gor*_*off 6

你可以通过decimal第一个来解决这个问题:

ALTER TABLE Customer ALTER COLUMN Phonenumber decimal(25, 0);
ALTER TABLE Customer ALTER COLUMN Phonenumber varchar(25);
Run Code Online (Sandbox Code Playgroud)

使用时会出现相同的行为cast():

select cast(cast(1549779498 as float) as varchar(255))
Run Code Online (Sandbox Code Playgroud)

所以修复程序说明如下:

select cast(cast(cast(1549779498 as float) as decimal(25)) as varchar(255))
Run Code Online (Sandbox Code Playgroud)

文档alter table alter column明确的引用cast():

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

编辑:

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

check (PhoneNumber not like '%[^0-9]%')
Run Code Online (Sandbox Code Playgroud)

这将确保将来在列中保留数字(仅限数字).