我有一个BINARY(8000)
列的现有表格。我试着做这样的事情:
ALTER TABLE [Member]
ALTER COLUMN [PublicCertificate] VARBINARY(MAX)
我得到了这个:
Msg 511,Level 16,State 1,Line 1
无法创建大小为8086的行,该行大于允许的最大行大小8060。 声明已经终止。
我了解BINARY(8000)
总是返回8000的长度,而其他3列的>= 8086
是ALTER COLUMN
。是否有一些{{1}}方法可以做到这一点?除了删除表格并重新开始之外的任何其他方式?这确实有效,但在我看来这是一个不优雅的解决方案。
答案 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。
如果你的桌子足够小,它应该非常快,不会破坏任何东西。如果你有大量的行,那么可能需要安排一个很短的停机时间。