Sql server 当在一个大表上增加VARCHAR列的大小时,会有什么问题吗?

Sql server 当在一个大表上增加VARCHAR列的大小时,会有什么问题吗?,sql-server,sql-server-2008,varchar,alter-column,Sql Server,Sql Server 2008,Varchar,Alter Column,我使用的是SQLServer2008,我需要在一个大约有500k行的表上增加一个VARCHAR字段,从(200到1200)。我需要知道的是,是否有任何问题我没有考虑 我将使用以下TSQL语句: ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200) 我已经在数据的副本上试过了,这句话并没有我所能看到的不良影响 那么,这样做是否有我可能没有考虑到的问题 顺便说一下,该列没有索引 这只是一个元数据更改:它很快 观察:如果设置的ANSI_x

我使用的是SQLServer2008,我需要在一个大约有500k行的表上增加一个VARCHAR字段,从(200到1200)。我需要知道的是,是否有任何问题我没有考虑

我将使用以下TSQL语句:

ALTER TABLE MyTable
ALTER COLUMN [MyColumn] VARCHAR(1200)
我已经在数据的副本上试过了,这句话并没有我所能看到的不良影响

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


顺便说一下,该列没有索引

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


观察:如果设置的ANSI_xx设置中的一个不同,例如由于某种原因在osql而非SSMS中运行,则明确指定NULL或NOT NULL以避免“事故”

从Varchar(200)更改为Varchar(1200)这应该不会给您带来任何问题,因为这只是元数据更改,而且SQL server 2008截断了过多的空格,您应该也看不到性能差异,因此简而言之,进行更改应该不会有任何问题。

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


alter table[table_name]修改column[column_name]varchar(1200)

我只想加上我的2美分,因为我在谷歌上搜索了这个问题b/c,我发现自己也遇到了类似的情况

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

——无停机时间
ALTER TABLE MyTable ALTER列[MyColumn]VARCHAR(1200)
--巨大的停机时间
ALTER TABLE MyTable ALTER列[MyColumn]VARCHAR(最大值)

PS.
nvarchar
或课程也是如此。

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

@nonnb:这是一个糟糕的想法@gbn贾斯汀最近对这个问题的回答有什么想法吗?似乎有点与您的不一致。@AakashM:他关于存储的看法是正确的,但这是一种开销,而不是优化。现在请阅读这个@gbn-好的观点,正如Martin Smith对索引的观察一样。撤回。结果是最后有一个被抓住了!该字段已编制索引,当有人试图输入大于900b的条目时,它失败了!注意,一切都很顺利。没问题。你知道当从
varchar(200)
varchar(max)
时,相同的规则是否适用吗?@code裸体:回答起来要复杂得多。(max)是LOB类型,可以是“行内”或行外。但是,我倾向于说它应该是相同的,因为数据已经“在行”,不需要重新生成表。我认为这可能适用于小表,但对于正在被查询的大表,这可能会阻塞相当长的时间(因为SQL server需要查看是否需要截断每一行)。这是因为您没有根据问题使用SQL Server(但可能使用MySQL)。“ALTER TABLE…MODIFY”不是有效的T-SQL。