Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中,将int类型的列更改为text类型_Sql_Sql Server_Database_Casting - Fatal编程技术网

在SQL Server中,将int类型的列更改为text类型

在SQL Server中,将int类型的列更改为text类型,sql,sql-server,database,casting,Sql,Sql Server,Database,Casting,我想将SQL Server中的列从int类型更改为text类型,同时保留列名。包含此列的表包含大量数据,我不想丢失它。SQLServer似乎不支持从int到text的隐式或显式转换,否则这将非常简单。那么,您将如何仅使用SQL来实现它呢?只需通过一个中间类型将其双重转换为您想要的类型即可 cast(cast(intField作为varchar)作为文本)下面是一个小脚本示例,显示了可能的方法: create table test (id int) create table test_tmp (

我想将SQL Server中的列从int类型更改为text类型,同时保留列名。包含此列的表包含大量数据,我不想丢失它。SQLServer似乎不支持从int到text的隐式或显式转换,否则这将非常简单。那么,您将如何仅使用SQL来实现它呢?

只需通过一个中间类型将其双重转换为您想要的类型即可


cast(cast(intField作为varchar)作为文本)

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

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,然后将其转换为文本值。最后,我们删除旧表并重命名临时表。

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

(一些SQL语法可能已关闭,我上次在另一份工作中执行此操作已经一年了,因此我无法访问MS SQL Server或源代码。如果您的专栏上有索引,您还必须执行更多操作。)

转换语法的道具

[编辑]


建议使用存储过程将
tempbar
重命名为
bar
(而不是步骤4-6)。这是一个特定于MS SQL Server的解决方案,可能适用于多种情况。我描述的解决方案将在任何SQL数据库上运行(带有语法修订),无论版本如何。在我的例子中,我处理的是主键和外键,而不仅仅是一个字段,因此我必须仔细地对所有操作进行排序,并且能够跨多个版本的MS SQL Server进行移植——这是对我有利的显式操作。

我将尝试一下。谢谢为什么MS SQL本身不能处理这个问题?
text
很特殊,您不能测试是否相等,必须使用全文索引等,因此只有已知包含文本数据的字段才能对其进行
cast
转换。而不是删除、重新添加然后填充栏,您可以删除它并重命名tempbar。有几个答案可以帮助您解决问题,但我想补充一点,文本数据类型有很多“陷阱”。假设您的SQL版本为2005或更高版本,那么使用VARCHAR(MAX)或NVARCHAR(MAX)几乎肯定会更好。即使不是,也要考虑使用非常大的VARCHAR或NVARCHAR。文本的任何特定原因而不是NVARCHAR(MAX)?文本类型的原因是基于遗留的。
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;