将SQL列的数据类型从nvarchar更改为int。

19

一个字段的数据类型能否从nvarchar更改为int?

alter table employee alter column designation int

这样做是否有效?如果无效,是否有其他方法可以实现?

附注:我正在使用 MS SQL Server


1
是的,我试过了。它报错说无法将varchar转换为int。我正在尝试通过cast语句找出解决方法。 - Mohit Jain
1
这意味着在该列中有一个或多个无法转换为int - 在尝试转换之前,您需要清理数据。 - Damien_The_Unbeliever
6个回答

23

你可以尝试使用 alter table 命令。如果失败,请按照以下步骤操作:

  1. 创建一个新的整数列:

ALTER TABLE tableName ADD newCol int;

  1. 将旧列中的数据选择到新列中:

UPDATE tableName SET newCol = CAST(oldCol AS int);

  1. 删除旧列。

即使从旧列选择数据到新列,也会出现问题,因为varchar无法复制到整数字段。 - Mohit Jain
这个链接提供了一个更好的答案,而且实际上是可行的。 - Adam Klein
如果你使用SQL Server,@AdamKlein的方法可能无效。 - Kyto

16

只有当您的列没有值或为空时才可能进行操作。如果您的列具有一些nvarchar类型的值,并且您尝试将其转换为int类型,它将显示错误。

ALTER TABLE [table_name] ALTER COLUMN [column_name] [data_type]

当列为空时它是可用的。在SQL中有没有将varchar转换为int的方法? - Mohit Jain
因为每种数据类型都有一些限制,比如大小或值,例如int只包含数字值并且大小为2字节,但nvarchar包含所有类型的值,并且它们的大小可以扩展。 - S. S. Rawat
1
这个答案的第一句话是不正确的。CREATE TABLE employee(designation NVARCHAR(10));INSERT INTO employee VALUES (N'10');alter table employee alter column designation int 是可以正常工作的。 - Martin Smith
这是不正确的 - 如果表中实际存在的数据类型可以转换为新的数据类型,那么在某些情况下,ALTER TABLE ALTER COLUMN 是完全可行的。 - Dan Field

5
  1. 添加新的数字列。
  2. 将旧字符列复制到新列中,并进行修剪和转换。
  3. 删除旧字符列。
  4. 将数字列重命名为旧列名称。

这对我起作用了(带小数,但我想它也适用于整数):

alter table MyTable add MyColNum decimal(15,2) null
go
update MyTable set MyColNum=CONVERT(decimal(15,2), REPLACE(LTRIM(RTRIM(MyOldCol)), ',', '.')) where ISNUMERIC(MyOldCol)=1
go
alter table MyTable drop column MyOldCol
go
EXEC sp_rename 'MyTable.MyColNum', 'MyOldCol', 'COLUMN'
go

4

只需要两步就可以更加简单地完成:

  1. 更新列并将所有非数字的值设置为null,以便修改不会失败。

  2. 修改表格并将类型设置为int。

UPDATE employee
SET designation = (CASE WHEN ISNUMERIC(designation)=1 THEN CAST(CAST(designation AS FLOAT) AS INT)END )

ALTER TABLE employee
ALTER COLUMN designation INT

这里假设列允许为空。如果不允许,则也需要处理。例如:通过更改列以允许为空,在将其转换为整数后,将所有空值设置为0,然后修改表以不允许为空。

2
  1. 创建临时列

    ALTER TABLE MYTABLE ADD MYNEWCOLUMN NUMBER(20,0) NULL;

  2. 将数据从旧列复制并转换到新列

    UPDATE MYTABLE SET MYNEWCOLUMN=CAST(MYOLDCOLUMN AS NUMBER(20,0));

  3. 删除旧列

    ALTER TABLE MYTABLE DROP COLUMN MYOLDCOLUMN;

  4. 将新列重命名为与旧列相同的名称。

    ALTER TABLE MYTABLE RENAME COLUMN MYNEWCOLUMN TO MYOLDCOLUMN;


0

你能试试这个吗?

alter table MyTable add MyColNum Varchar(500) null;
alter table MyTable add MyColNum int null;

请尝试使用文本区域上方的工具格式化您的问题/答案。 - smilyface

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接