SQL 将列类型从 float 转换为 varchar
SQL Converting Column type from float to varchar
我正在尝试将 table 中列的数据类型从 Float
(空)更改为 Varchar(25)
(空)。当前数据中最大的浮点数是12位,但未来可能要增加更多位,因此varchar(25)
。
列中的当前数据是 phone 个数字。必须进行更改以允许前面的零。
但是,我在执行此操作时遇到了一些困难。
我试过以下方法:
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'
这也不行:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
现在已经很晚了,我的头很痛……
有人能帮忙吗?
注意:
table 相当大,大约有 150 万行,因此性能可能是个问题。
使用SQL 服务器。
您可以先通过 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
的 documentation 明确引用 cast()
:
Some data type changes may cause a change in the data. For example,
changing an nchar or nvarchar column to char or varchar may cause the
conversion of extended characters. For more information, see CAST
and CONVERT (Transact-SQL). Reducing the precision or scale of a
column may cause data truncation.
编辑:
加载数据后,我建议您也添加一个检查约束:
check (PhoneNumber not like '%[^0-9]%')
这将确保将来数字(而且只有数字)保留在列中。
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
将 float 直接转换为 varchar 可能很棘手。仅仅改变列数据类型是不够的。
第 1 步:备份您的数据 table。
SELECT * INTO Customer_Backup FROM Customer
第 2 步:使用 SQL 服务器脚本删除并创建原始数据 table // 或 // 删除并更改列的数据类型
ALTER TABLE Customer
ALTER COLUMN Phonenumber varchar(25)
第 3 步:在您的场景中,由于 phone 数字在 float 列中没有十进制数据值,我们可以先将其转换为 int,然后再转换为 varchar,如下所示
INSERT into Customer (Phonenumber)
SELECT convert (varchar(25), convert(int, [Phonenumber])) as [Phonenumber]
FROM Customer_Backup
我正在尝试将 table 中列的数据类型从 Float
(空)更改为 Varchar(25)
(空)。当前数据中最大的浮点数是12位,但未来可能要增加更多位,因此varchar(25)
。
列中的当前数据是 phone 个数字。必须进行更改以允许前面的零。
但是,我在执行此操作时遇到了一些困难。
我试过以下方法:
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'
这也不行:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
现在已经很晚了,我的头很痛……
有人能帮忙吗?
注意:
table 相当大,大约有 150 万行,因此性能可能是个问题。
使用SQL 服务器。
您可以先通过 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
的 documentation 明确引用 cast()
:
Some data type changes may cause a change in the data. For example, changing an nchar or nvarchar column to char or varchar may cause the conversion of extended characters. For more information, see CAST and CONVERT (Transact-SQL). Reducing the precision or scale of a column may cause data truncation.
编辑:
加载数据后,我建议您也添加一个检查约束:
check (PhoneNumber not like '%[^0-9]%')
这将确保将来数字(而且只有数字)保留在列中。
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
将 float 直接转换为 varchar 可能很棘手。仅仅改变列数据类型是不够的。
第 1 步:备份您的数据 table。
SELECT * INTO Customer_Backup FROM Customer
第 2 步:使用 SQL 服务器脚本删除并创建原始数据 table // 或 // 删除并更改列的数据类型
ALTER TABLE Customer
ALTER COLUMN Phonenumber varchar(25)
第 3 步:在您的场景中,由于 phone 数字在 float 列中没有十进制数据值,我们可以先将其转换为 int,然后再转换为 varchar,如下所示
INSERT into Customer (Phonenumber)
SELECT convert (varchar(25), convert(int, [Phonenumber])) as [Phonenumber]
FROM Customer_Backup