我正在使用SQL Server 2008,我需要在一个大约500k行的表上创建一个更大的VARCHAR字段,从(200到1200)。我需要知道的是,如果有任何问题我没有考虑过。
我将使用此TSQL语句:
ALTER TABLE MyTable
ALTER COLUMN [MyColumn] VARCHAR(1200)
我已经在数据的副本上试过了,这个声明没有我能看到的不良影响。
这样做有什么可能的问题我可能没有考虑过吗?
顺便说一句,该列未编入索引。
答案 0 :(得分:56)
这只是元数据更改:它很快。
观察:明确指定NULL或NOT NULL以避免“其他”SET ANSI_xx设置不同时出现“意外”,例如由于某种原因在osql而不是SSMS中运行
答案 1 :(得分:10)
只想加我2美分,因为我用谷歌搜索了这个问题b / c我发现自己处于类似情况......
BE AWARE ,从varchar(xxx)
更改为varchar(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
或课程。
答案 2 :(得分:4)
从Varchar(200)更改为Varchar(1200)应该没有问题,因为它只是元数据更改,并且由于SQL Server 2008截断了过多的空格,您应该看不出性能差异,所以总之应该没有问题做出改变。
答案 3 :(得分:0)
您应该避免将列转换为varchar(max)的另一个原因是您无法在varchar(max)列上创建索引。
答案 4 :(得分:-3)
在我的情况下,alter column无效,因此可以使用'修改'命令,如:
alter table [table_name] MODIFY列[column_name] varchar(1200);