如何在SQL Server中将某列的数据类型从整数更改为文本?

12

我需要将一个数据库列从整数类型更改为字符串/文本类型,但我不确定如何操作。

该列原本是用来存储标识号码的,但最近ID格式已更改,现在ID中包含ASCII字符(因此新ID不能作为整数存储)。

我正在更新的应用程序是使用Delphi 7编写的,并使用odbcexpress组件进行SQL Server库的操作。

是否可以使用 ALTER TABLE 来实现?还是需要将数据复制到新的字符串类型的列中,删除旧的整数类型的列,然后将新的字符串类型的列重命名为旧的名称?

你能提供一个示例吗?我对SQL Server的工作流程并不是很熟悉。

谢谢!


1
在这里,编写Delphi(任何版本)的应用程序以及ODBC Express组件都不重要。重要的是您通过ODBC访问表格,这是相当标准化的。(换句话说,Delphi标签实际上并不相关。) - Ken White
2个回答

15

ALTER TABLE正是您想要做的。

您的SQL可能看起来像这样:

ALTER TABLE dbo.MyTable ALTER COLUMN MyColumn VARCHAR(20) NOT NULL;

请注意,如果您的其他列引用了这个列,您也必须更新那些列,通常需要暂时删除外键约束,进行更改,然后重新创建外键约束。

不要忘记同时更改任何依赖项或下游内容,例如存储过程中的任何变量或您的Delphi代码。

有关注释的其他信息(感谢所有人):
alter column 操作将保留数据,因为它将被隐式转换为新类型。 int 转换为 varchar 没有问题,只要您的 varchar 宽度足以容纳至少转换值的最大值。对于 int 的完全安全,我经常使用 varchar(11) 或更大的值,以处理最宽的 int 值: 二十亿。


1
我的担忧是我不想失去任何原始数据(因为有很多数据)。alter table 命令会自动将整数转换为字符串表示吗?再次感谢! - Evan Zimmerman
6
ALTER TABLE .. ALTER COLUMN ... 可以修改数据表中的列而不影响原有数据,但需要注意被修改的数据能否转换成新的数据格式。例如从 INT 转换为 VARCHAR 不会有问题,只要 VARCHAR 的长度足够存放所有的 INT 值即可。由于 INT 的最大值为 20 亿,其最多包含 10 位数字,因此设置一个 VARCHAR(20) 就可以容纳任何可能出现的 INT 值。这个过程是没有问题的,但一定要在实际数据库的 副本 上进行测试,不要直接在生产环境中操作。 - marc_s
4
出于好奇,我测试了一下如果你让文本列太短会发生什么。我原以为SQL Server会报错(就像当使一个有空值的列变成“NOT NULL”时一样)。然而,我有点失望地发现它只是将值更改为“*”。 - Disillusioned
@CraigYoung 这也会发生在转换时;我不确定是否有相关的设置。 - Tim Lehner
1
@marc_s 这可能有点傻,但我通常将整数强制转换为varchar(11),因为它可以处理负二十亿。 - Tim Lehner
太好了!感谢大家提供的信息。我看到的新ID长度接近20个字符,所以为了安全起见,我会将其更改为varchar(50),根据你们的评论,这似乎不是问题 :) - Evan Zimmerman

0
ALTER TABLE your_table MODIFY your_column_name varchar(255) null;

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