2012-03-14 89 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