将Varchar(255)改为Varchar(MAX)

61

在 SQL Server 2008 数据库中,是否可以将列的类型从 varchar(255) 更改为 varchar(MAX) 而无需删除表并重新创建?

每次我尝试使用 SQL Server Management Studio 进行更改时都会出现错误。但如果能够避免这个麻烦,知道是否可以在不删除和创建的情况下更改类型会很好。

谢谢。


2
奇怪的是,在SQL Server 2005中尝试了一下,对我来说运行良好。 - anonymous
2
顺便问一下,抛出了什么错误? - anonymous
1
"不允许保存更改。您所做的更改需要删除并重新创建以下表格。您可能已经对无法重新创建的表格进行了更改,或者启用了“防止保存更改”选项。""未启用“防止保存更改”选项..." - Darbio
SQL管理工作室可以实现这一点(请参阅更改脚本以查看他们用于修改表的SQL语句),@astander的答案是更好的选择。很高兴你找到了解决方案:D - anonymous
3个回答

104
你可以使用TSQL来完成这个任务。
类似以下代码:
ALTER TABLE [table] ALTER COLUMN [column] VARCHAR(MAX)

15
“保存更改不被允许。您所做的更改要求删除并重新创建以下表格。您已经对无法重新创建的表格进行了更改或启用了“防止保存需要重新创建表格的更改”选项。”“防止保存更改”的选项未启用。”
这是SQL Server Management Studio 2008中的新“功能”,默认情况下已开启。每当您进行较大的更改时,SSMS只能通过创建一个新表并将数据从旧表移动到新表来重新创建表 - 所有这些都在后台完成(这些更改包括重新排序列等)。
此选项默认为关闭状态,因为如果您的表具有FK约束等内容,则重做表的方式可能会失败。但您肯定可以打开该功能!

alt text

这个选项在 工具 > 选项 中,取消勾选该选项后,您就可以再次在表设计器中对表结构进行此类更改。


谢谢marc_s。我已经取消了这个选项,但它仍然阻止我进行更改。astander上面的修改语句在我自己编写时有效。谢谢 :) - Darbio
@JD:嗯...奇怪...通常那就是问题所在-不过很高兴你已经有解决方案了! - marc_s

3

请注意
类似于以下内容

ALTER TABLE [table] ALTER COLUMN [column] VARCHAR(MAX)

https://dba.stackexchange.com/questions/15007/change-length-of-varchar-on-live-prod-table

马丁·史密斯的回答:

如果你将其增大为varchar(100 - 8000)(即除varchar(max)外的任何值),并且你是通过TSQL而不是SSMS GUI进行操作

ALTER TABLE YourTable ALTER COLUMN YourCol varchar(200) [NOT] NULL
,并且没有将列的可空性从NULL更改为NOT NULL(在这种情况下,在验证所有行并潜在地从NOT NULLNULL更改后),则这是一种快速的仅元数据更改。它可能需要等待对表的SCH-M锁定,但一旦获取该锁定,更改将几乎瞬间完成。
要注意的一个问题是,在等待SCH-M锁定期间,其他查询将被阻塞,而不是跳过队列排在前面,因此您可能需要考虑首先添加SET LOCK_TIMEOUT
此外,请确保在ALTER TABLE语句中明确指定NOT NULL,如果那是原始列状态,否则该列将被更改为允许NULL


这不是与这个现有答案完全相同吗? - Pang
2
为什么将数据类型 ALTER 为 varchar(MAX) 是一个问题? - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接