2012-03-14 74 views
3

我需要将数据(varbinary(max))从一个表迁移到另一个表。当执行更新要做到这一点,我得到以下错误复制varbinary(max)字段时超出最大行大小

Msg 511, Level 16, State 1, Line 18 
Cannot create a row of size 8078 which is greater than the allowable 
maximum row size of 8060. 

这是我用来从表DocumentPublication复制到DocumentVersion

UPDATE docver SET RecapRTF = CAST(RTFPublication as VARBINARY(MAX)) FROM 
DocumentVersion docver INNER JOIN DocumentPublication docpub 
ON docpub.IdDocumentVersion = DOCVER.id 

或不投更新

UPDATE docver SET RecapRTF = RTFPublication FROM 
DocumentVersion docver INNER JOIN DocumentPublication docpub 
ON docpub.IdDocumentVersion = DOCVER.id 

通过逐行执行更新,我隔离了提供错误的行。奇怪的是,这个字段中的数据只有3950字节,而其他行少或更多(例如2000字节或20MB)的行可以正常工作。

我已经用不同的名称重新创建了目标表,现在它可以复制varbinary字段!?!?

SQL Server版本是2008 R2与最新的更新和数据库兼容性100(SQL Server 2008)。我运行了DBCC CHECKDB和DBCC CHECKALLOC,但没有发现错误。

任何线索可能是错误的地方?

回答

4

您的docver表可能有一个被删除或更改的列仍然占用空间。

Why should I rebuild a table after dropping or adding a column?

+0

非常感谢您指出了这一点!这让我非常头疼。现在我也明白了为什么SMSS中的设计师在对表格进行一些“微小”更改时会生成一个新表格。 – Martin 2012-03-14 12:34:44

2

只要你不必去查......

ALTER TABLE [docver] REBUILD 
+0

甜,谢谢你! – Martin 2012-07-26 11:48:33