将列类型从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
- 将数据从一列转换和复制到另一列
- 删除旧列
- 将新列重命名为旧名称
使用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))
foralter 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