4

我有一个带有BINARY(8000)列的现有表。我试图做这样的事情:

ALTER TABLE [Member] 
  ALTER COLUMN [PublicCertificate] VARBINARY(MAX)

我明白了:

消息 511,级别 16,状态 1,行 1
无法创建大小为 8086 的行,该行大于允许的最大行大小 8060。语句已终止。

我知道BINARY(8000)总是返回 8000 的长度,并且 + 其他 3 列是>= 8086. 有没有ALTER COLUMN办法做到这一点?除了删除表并重新开始之外还有什么方法?这确实有效,但在我看来是一个不优雅的解决方案。

4

2 回答 2

2

更新:感谢您的建议。第一个给了我解决方案的想法。这就是我所做的:

1) CREATE TABLE [MemberTemp] (
[ID] [int] IDENTITY(1,1) NOT NULL,
[PublicCertificate] [varbinary](max) NULL
)

2) SET IDENTITY_INSERT [MemberTemp] ON

3) INSERT INTO [MemberTemp] ( [ID], [PublicCertificate] )
     SELECT [ID], [PublicCertificate] FROM [Member]

4) ALTER TABLE [Member] DROP COLUMN [PublicCertificate]

5) ALTER TABLE [Member] ADD [PublicCertificate] VARBINARY(MAX)

6) I went to the clustered index ran Rebuild to free space...

7) UPDATE [Member] SET [PublicCertificate] = [MemberTemp].PublicCertificate
   FROM [Member]
   INNER JOIN [MemberTemp] on [Member].[ID] = [MemberTemp].ID

砰! 做到了。

于 2013-07-30T14:49:44.097 回答
1

我想说你最好的选择是创建一个新列,用一个大update语句复制值,然后删除原始列并重命名新列。

如果你的桌子足够小,它应该发生得非常快并且不会破坏任何东西。但是,如果您有大量行,则可能值得安排短暂的停机时间。

于 2013-07-29T17:27:18.343 回答