88

我正在使用 SQL Server 2008,我需要在大约 500k 行的表上使 VARCHAR 字段更大,从(200 到 1200)。我需要知道的是是否有任何我没有考虑过的问题。

我将使用这个 TSQL 语句:

ALTER TABLE MyTable
ALTER COLUMN [MyColumn] VARCHAR(1200)

我已经在数据副本上进行了尝试,并且该声明没有我能看到的不良影响。

那么这样做有没有我可能没有考虑到的问题?

顺便说一句,该列没有被索引。

4

5 回答 5

60

这只是元数据更改:它很快。

观察:如果 SET ANSI_xx 设置之一不同,则明确指定 NULL 或 NOT NULL 以避免“意外”,例如由于某种原因在 osql 而不是 SSMS 中运行

于 2011-09-22T10:53:16.800 回答
13

只是想加我的 2 美分,因为我用谷歌搜索了这个问题 b/c 我发现自己处于类似的情况......

请注意,虽然从varchar(xxx)tovarchar(yyy)更改确实是元数据更改,但更改varchar(max)为不是。因为varchar(max)值(又名 BLOB 值 - 图像/文本等)在磁盘上的存储方式不同,不是在表行内,而是“行外”。因此,服务器将在一张大桌子上发疯并在几分钟(几小时)内变得无响应。

--no downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200)

--huge downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(max)

PS。同样适用于nvarchar或课程。

于 2016-12-06T16:23:23.620 回答
4

从 Varchar(200) 更改为 Varchar(1200) 应该不会给您带来任何问题,因为它只是元数据更改,并且由于 SQL Server 2008 会截断过多的空格,因此您应该不会看到任何性能差异,因此简而言之,制作改变。

于 2011-09-22T16:08:50.673 回答
0

应避免将该列转换为 varchar(max) 的另一个原因是因为您无法在 varchar(max) 列上创建索引。

于 2018-05-04T14:59:34.683 回答
-3

在我的情况下,alter 列不起作用,因此可以使用“修改”命令,例如:

alter table [table_name] MODIFY column [column_name] varchar(1200);

于 2014-11-27T08:59:40.337 回答