如何将BINARY(8000)列转换为VARBINARY(MAX)

时间:2013-07-29 17:22:30

标签: sql sql-server-2008 tsql

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

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

我得到了这个:

  

Msg 511,Level 16,State 1,Line 1   
无法创建大小为8086的行,该行大于允许的最大行大小8060。   声明已经终止。

我了解BINARY(8000)总是返回8000的长度,而其他3列的>= 8086ALTER COLUMN。是否有一些{{1}}方法可以做到这一点?除了删除表格并重新开始之外的任何其他方式?这确实有效,但在我看来这是一个不优雅的解决方案。

2 个答案:

答案 0 :(得分: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

砰!这样做了。

答案 1 :(得分:1)

我认为您最好的选择是创建一个新列,使用一个大update语句复制值,然后删除原始列和rename the new one

如果你的桌子足够小,它应该非常快,不会破坏任何东西。如果你有大量的行,那么可能需要安排一个很短的停机时间。