我想在类型为int的情况下更改SQL Server中的列,以便在保持列名的同时键入text。这个列的表有很多数据,我不想丢失它。 SQL Server似乎不支持从int到text的隐式或显式转换,否则这将非常简单。那么,你将如何仅使用SQL?
答案 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,然后我们将其转换为文本值。最后,我们删除旧表并重命名临时表。