2010-10-11 37 views
10

我們在我們的數據庫中的表收到此錯誤的最大允許更大:不能創建大小8937的一排,比8060

不能創建大小8937的一排是超過了允許更大 最大值8060.

該表由約400個varchar(max)字段組成。但是,我們只在這些字段中插入空字符串。

該插入似乎工作,但是當使用SqlXml讀取數據或在表的主鍵上運行DBCC DBREINDEX時,會發生錯誤。

它只出現在一個特定的SQL Server (2005)而不是其他人(2005 Express)上。問題機正在運行64-bit Windows,其他問題機正在運行32-bit windows

有沒有人對此有過任何想法?請讓我知道是否需要包含更多信息。


看了一些您的回答,我想指出,我完全同意,這是比較極端的,不尋常的,而不是在所有明智的,然後再嘗試使用此VARCHAR許多(最大值)列。這是有原因的,主要是不受我控制,我不會進入這裏。

回答

14

錯誤是由於您不能在SQL服務器中存在大於8KB(1頁大小)的行,因爲行不允許跨頁 - 它是SQL Server的基本限制,您可以閱讀更多約在這裏:

注意,SQL服務器將允許您創建表,但是如果你嘗試實際插入跨越多個頁面的任何數據,那麼它會給上述錯誤。

當然這並不完全相加,因爲如果上面是全部真相,那麼單個的VARCHAR(8000)列將填滿表中的一行! (這曾經是這種情況)。 SQL Server 2005解決了這個限制,它允許一行中的某些數據存儲在另一個頁面中,而是保留一個24字節的指針。你可以閱讀這個在這裏:

正如你可以看到現在這意味着行現在可以跨越多個頁面,但是單列行還需要放入一個(因此列的最大尺寸爲VARCHAR(8000)),並且您可以擁有的這些列的總數仍然有限(根據我的估計,大約爲8000/24 =〜300)

當然這是al我錯過了主要觀點,那就是在一張桌子上有400個寬的柱子是荒謬的!

你應該採取一個長期艱難的看看你的數據庫模式,並提出了一些更合理的 - 你可以有選擇的列大小一些較爲保守的估計(如VARCHAR(255)VARCHAR(50))開始,但你真的需要分割一些將這些字段分解成單獨的表格。

+0

非常感謝您的回覆。整個事情現在更加清晰。我同意使用這個數量的varchar(max)列是不可取的,但是你的第三個鏈接真的解釋了實際的限制以及爲什麼忽視什麼是合理的。你的數字8000/24是有意義的,因爲每個varchar(max)都會有一個24字節的指向真實數據的指針。再次感謝,我會回到現實中,縮短一些專欄並拆分表格。 – 2010-10-11 13:42:15

+0

@EasyTimer - 很高興知道我幫助:-) – Justin 2010-10-11 13:43:34

0

將表拆分爲多個。

1

行大小取決於列的類型,而不是您存儲在其中的數據量。

在一個表中有400個varchar字段告訴我你做錯了什麼。也許你需要normalize的架構?

9

您可能在仍佔用空間的表格中有a deleted column。另外檢查「行中的文本」設置是否相同。

+0

非常感謝您的回覆,它給了我一些有用的信息,儘管我已經完全重新創建了表格,所以我不認爲這可能是問題所在。 – 2010-10-11 13:32:43

相關問題