我试图将表格中的数据类型从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。
答案 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