SQL将列类型从float转换为varchar

时间:2015-08-12 16:04:25

标签: sql sql-server copy sql-types

我试图将表格中的数据类型从Float(null)更改为Varchar(25)(null)。当前数据中最大的浮点数是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'

这不起作用:

  

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

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

有人可以帮忙吗?

注:

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

使用SQL Server。

3 个答案:

答案 0 :(得分:5)

您可以先通过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的{​​{3}}明确引用cast()

  

某些数据类型更改可能会导致数据发生更改。例如,   将nchar或nvarchar列更改为char或varchar可能会导致   转换扩展字符。有关详细信息,请查看CAST   和CONVERT(Transact-SQL)。降低a的精度或规模   列可能会导致数据截断。

编辑:

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

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

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

答案 1 :(得分:0)

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 

答案 2 :(得分:0)

直接浮点到 varchar 的转换可能很棘手。仅仅改变列数据类型是不够的。

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

SELECT * INTO Customer_Backup FROM Customer

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

ALTER TABLE Customer 
ALTER COLUMN Phonenumber varchar(25)

第 3 步:在您的场景中,由于电话号码在浮点列中没有十进制数据值,我们可以先将其转换为 int,然后再转换为如下所示的 varchar

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