将列类型从float转换为varchar的SQL

将列类型从float转换为varchar的SQL,sql,sql-server,copy,sql-types,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 然后我尝

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

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

然而,我在做这件事时遇到了一些困难

我尝试了以下方法:

ALTER TABLE Customer 
ALTER COLUMN Phonenumber varchar(25)
这并没有给我想要的结果

例如
1549779498
变成
1.54978e+009

然后我尝试了以下几行:

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

这也不起作用:

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时

现在很晚了,我的头很痛

有人能帮忙吗

注:

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


使用SQL Server

您可以通过先执行
十进制
来解决此问题:

ALTER TABLE Customer ALTER COLUMN Phonenumber decimal(25, 0);
ALTER TABLE Customer ALTER COLUMN Phonenumber varchar(25);
使用
cast()
时,您会得到相同的行为:

因此,修复方法如下所示:

select cast(cast(cast(1549779498 as float) as decimal(25)) as varchar(255))
for
alter table alter列
明确引用了
cast()

某些数据类型更改可能会导致数据更改。例如 将nchar或nvarchar列更改为char或varchar可能会导致 扩展字符的转换。有关详细信息,请参见强制转换 和转换(Transact-SQL)。降低一个项目的精度或规模 列可能导致数据截断

编辑:

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

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

这将确保数字——并且只有数字——在将来保留在列中。

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

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 
步骤1:备份数据表

SELECT * INTO Customer_Backup FROM Customer
步骤2:使用SQL Server脚本//删除并创建原始数据表//或//删除并更改列的数据类型

ALTER TABLE Customer 
ALTER COLUMN Phonenumber varchar(25)
步骤3:在您的场景中,由于电话号码在float列中没有十进制数据值,我们可以先将其转换为int,然后再转换为varchar,如下所示

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

使用此代码仍然会得到原始帖子中描述的错误。这似乎有效。因此,如果我正确理解十进制转换的诀窍,首先是确保我直接使用nvarchar得到的舍入误差被消除?@user2110298。是的,尽管我不确定它们是否是精确的舍入误差。用于转换的表示不是您想要的,这是解决该问题的一种相对简单的方法。
ALTER TABLE Customer 
ALTER COLUMN Phonenumber varchar(25)
INSERT into Customer (Phonenumber) 
SELECT convert (varchar(25), convert(int, [Phonenumber])) as [Phonenumber]
FROM Customer_Backup