create table tb(a text) insert into tb values ('aaaaaa') goalter table tb alter column a char(255) goselect * from tbdrop table tb
在企业管理器里修改char不指定(默认16)字符生成脚本,改脚本的char长度执行..以下是生成格式: create table T(Col text) insert T select 'abcdex' goBEGIN TRANSACTION SET QUOTED_IDENTIFIER ON SET ARITHABORT ON SET NUMERIC_ROUNDABORT OFF SET CONCAT_NULL_YIELDS_NULL ON SET ANSI_NULLS ON SET ANSI_PADDING ON SET ANSI_WARNINGS ON COMMIT BEGIN TRANSACTION CREATE TABLE dbo.Tmp_T ( Col char(255) NULL ) ON [PRIMARY] GO IF EXISTS(SELECT * FROM dbo.T) EXEC('INSERT INTO dbo.Tmp_T (Col) SELECT CONVERT(char(255), Col) FROM dbo.T (HOLDLOCK TABLOCKX)') GO DROP TABLE dbo.T GO EXECUTE sp_rename N'dbo.Tmp_T', N'T', 'OBJECT' GO COMMIT
create table tb(a text) insert into tb values ('aaaaaa') go--加个列B alter table tb add b char(255) go --将B设置为A的值 update tb set b = cast(a as varchar) go --删除A alter table tb drop column a go --更改列名B为A EXEC sp_rename 'tb.[b]', 'a', 'COLUMN' goselect * from tbdrop table tb/* a --------------------- aaaaaa (所影响的行数为 1 行) */
insert into tt2 select 'aaa'alter table tt2 alter column a char(255)
但是我尝试过不行无法更新列'a'.因为类型是'text'后来查CSDN,貌似上面说不能修改类型'text',ntext,image等类型的列
所以来这里确认下
create table tb(a text)
insert into tb values ('aaaaaa')
goalter table tb alter column a char(255)
goselect * from tbdrop table tb/*
a
------------
aaaaaa (1 行受影响)
*/--2000更改失败,研究中...
create table tb(a text)
insert into tb values ('aaaaaa')
goalter table tb alter column a char(255)
goselect * from tbdrop table tb
服务器: 消息 4928,级别 16,状态 1,行 2
无法更改列 'a',因为该列是 'text'。(所影响的行数为 1 行)
ALTER COLUMN指定要更改给定列。如果兼容级别是 65 或小于 65,将不允许使用 ALTER COLUMN。有关更多信息,请参见 sp_dbcmptlevel。 要更改的列不能是: 数据类型为 text、image、ntext 或 timestamp 的列。
表的 ROWGUIDCOL 列。
计算列或用于计算列中的列。
被复制列。
用在索引中的列,除非该列数据类型是 varchar、nvarchar 或 varbinary,数据类型没有更改,而且新列大小等于或者大于旧列大小。
用在由 CREATE STATISTICS 语句创建的统计中的列。首先用 DROP STATISTICS 语句删除统计。由查询优化器自动生成的统计会由 ALTER COLUMN 自动除去。
用在 PRIMARY KEY 或 [FOREIGN KEY] REFERENCES 约束中的列。
用在 CHECK 或 UNIQUE 约束中的列,除非用在 CHECK 或 UNIQUE 约束中的可变长度列的长度允许更改。
有相关联的默认值的列,除非在不更改数据类型的情况下允许更改列的长度、精度或小数位数。
有些数据类型的更改可能导致数据的更改。例如,将数据类型为 nchar 或 nvarchar 的列更改为 char 或 varchar 类型,将导致扩展字符的转换。有关更多信息,请参见 CAST 和 CONVERT。降低列的精度和小数位数可能导致数据截断。
insert into tt2 select 'aaa'alter table tt2 alter column a char(255)
表的 ROWGUIDCOL 列。
计算列或用于计算列中的列。
被复制列。
用在索引中的列,除非该列数据类型是 varchar、nvarchar 或 varbinary,数据类型没有更改,而且新列大小等于或者大于旧列大小。
用在由 CREATE STATISTICS 语句创建的统计中的列。首先用 DROP STATISTICS 语句删除统计。由查询优化器自动生成的统计会由 ALTER COLUMN 自动除去。
用在 PRIMARY KEY 或 [FOREIGN KEY] REFERENCES 约束中的列。
用在 CHECK 或 UNIQUE 约束中的列,除非用在 CHECK 或 UNIQUE 约束中的可变长度列的长度允许更改。
有相关联的默认值的列,除非在不更改数据类型的情况下允许更改列的长度、精度或小数位数。
有些数据类型的更改可能导致数据的更改。例如,将数据类型为 nchar 或 nvarchar 的列更改为 char 或 varchar 类型,将导致扩展字符的转换。有关更多信息,请参见 CAST 和 CONVERT。降低列的精度和小数位数可能导致数据截断。
insert into tb values ('aaaaaa')
goalter table tb alter column a char(255)
goselect * from tbdrop table tb
create table T(Col text)
insert T select 'abcdex'
goBEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
CREATE TABLE dbo.Tmp_T
(
Col char(255) NULL
) ON [PRIMARY]
GO
IF EXISTS(SELECT * FROM dbo.T)
EXEC('INSERT INTO dbo.Tmp_T (Col)
SELECT CONVERT(char(255), Col) FROM dbo.T (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.T
GO
EXECUTE sp_rename N'dbo.Tmp_T', N'T', 'OBJECT'
GO
COMMIT
insert into tb values ('aaaaaa')
go--加个列B
alter table tb add b char(255)
go
--将B设置为A的值
update tb set b = cast(a as varchar)
go
--删除A
alter table tb drop column a
go
--更改列名B为A
EXEC sp_rename 'tb.[b]', 'a', 'COLUMN'
goselect * from tbdrop table tb/*
a
---------------------
aaaaaa (所影响的行数为 1 行)
*/