2010-04-23 114 views
38

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

SQL Server Management Studio每次尝试使用它时都会引发错误 - 但为了节省自己的头痛,我很高兴知道是否可以在不需要DROP和CREATE的情况下更改此类型。

感谢

+2

奇怪,在SQL Server 2005中试用过,对我来说工作正常。 – anonymous 2010-04-23 03:22:10

+2

顺便说一句,错误是什么引发的? – anonymous 2010-04-23 03:29:20

+1

'不允许保存更改。您所做的更改需要删除并重新创建以下表格。您要么对无法重新创建的表格进行更改,要么已启用“禁止保存需要重新创建表格的更改”选项。 选项'禁止保存更改'未启用... – Darbio 2010-04-23 03:34:24

回答

66

您应该可以使用T-SQL来做到这一点。

喜欢的东西

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

这工作。感谢 – Darbio 2010-04-23 03:55:42

+0

对我来说也帮了我...谢谢 – 2015-07-03 11:38:07

11

“保存更改是不允许的。您所做的更改要求 需要删除以下表格, 重新创建。您已对 重新创建或启用选项012xx的表进行了 更改。防止保存需要重新创建 表的更改。选项 “防止保存更改”未启用 ..

这是在SQL Server Management Studio 2008中的默认情况下是开启一个新的“功能”。每当你做出更大的改变时,SSMS只能通过创建一个新表来重新创建表,然后移动旧表中的数据 - 所有这些都在后台(这些更改包括重新排列列以及其他内容)。

这个选项默认是关闭的,因为如果你的表有FK约束和东西,这种重做表的方式可能会失败。但是你绝对可以开启这个功能!

alt text http://i42.tinypic.com/19pegj.png

这是Tools > Options下,一旦取消选中该选项,您可以再次做这几样在表设计更改表结构。

+0

谢谢marc_s。我已经取消了这个选项,但仍然阻止我进行更改。当我自己写他们的时候,上面的旁观者的alter语句就起作用了。谢谢:) – Darbio 2010-04-23 06:54:13

+0

@JD:嗯......奇怪......通常这是问题 - 很高兴你已经有了解决方案,不过! – 2010-04-23 11:56:40

1

注意
喜欢的东西

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

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

马丁·史密斯的answare:

如果你正在增加它varchar(100 - 8000)(即比varchar(max))其他任何东西,你这样做通过TSQL而不是SSMS GUI

ALTER TABLE YourTable ALTER COLUMN YourCol varchar(200) [NOT] NULL
而不是将列的可空性从 NULLNOT NULL(在某些情况下,这将锁定表,同时对所有行进行验证,并可能将其写入或从 NOT NULL更改为 NULL,然后这是一个快速元数据更改。它可能需要等待表上的 SCH-M锁,但一旦获得该更改将非常即时。 需要注意的一点是,在等待 SCH-M锁定期间,其他查询将被阻止,而不是先跳过队列,因此您可能首先考虑添加 SET LOCK_TIMEOUT。 还要确保在 ALTER TABLE语句中明确指定 NOT NULL如果这是原始列​​状态,否则该列将更改为允许 NULL

+0

这与[现有的答案](http://stackoverflow.com/a/2696003/1402846)是否相同? – Pang 2015-11-26 00:55:07

+1

为什么问题是ALTER varchar(MAX)? – Chris 2016-09-06 22:54:56