在SQL Server中更改int类型的列以键入text

时间:2009-12-02 15:15:26

标签: sql sql-server database casting

我想在类型为int的情况下更改SQL Server中的列,以便在保持列名的同时键入text。这个列的表有很多数据,我不想丢失它。 SQL Server似乎不支持从int到text的隐式或显式转换,否则这将非常简单。那么,你将如何仅使用SQL?

3 个答案:

答案 0 :(得分:9)

由于MS SQL Server(与大多数数据库一样)不支持直接更改现有列的类型,因此您必须分步执行。我过去解决这类问题的方法是(假设你的表名为'foo',你的列名为'bar'):

ALTER TABLE foo ADD COLUMN tempbar text;
UPDATE foo SET tempbar = cast(cast(bar as varchar) as text);
ALTER TABLE foo DROP COLUMN bar;
ALTER TABLE foo ADD COLUMN bar text;
UPDATE foo SET bar = tempbar;
ALTER TABLE foo DROP COLUMN tempbar;

(某些SQL语法可能已关闭,自我上次执行此操作已有一年,处于不同的工作,因此我无法访问MS SQL Server或源代码。您还必须执行此操作如果您的列上有索引,则会有更多内容。)

转化语法支持Donnie

<强> [编辑]

Tom H.建议使用sp_rename存储过程将tempbar重命名为bar(而不是步骤4-6)。这是一个MS SQL Server特定的解决方案,可能适用于许多情况。我描述的解决方案将在任何 SQL数据库上运行(使用语法修订),无论版本如何。在我的情况下,我正在处理主键和外键,而不仅仅是单个字段,所以我必须仔细地命令所有操作并且可以跨多个版本的MS SQL Server移植 - 明确地对我有利。< / p>

答案 1 :(得分:5)

将它通过中间类型双重投射到你想要的。

cast(cast(intField as varchar) as text)

答案 2 :(得分:0)

这是一个示例脚本,显示了可能的方法:

create table test (id int)

create table test_tmp (id ntext)


insert into test
values (1)
insert into test
values (2)

insert into test_tmp 
select convert(ntext,cast(id as nvarchar)) from test

drop table test

exec sp_rename 'test_tmp','test'

基本上我们创建表的副本,然后填充它。我们首先将int转换为nvarchar,然后我们将其转换为文本值。最后,我们删除旧表并重命名临时表。