2010-01-25 56 views
4

將列添加到現有表時,我遇到了這個奇怪的問題。無法創建一個8064的行,該行的行數大於允許的行數8060

現有的表如下所示:

CREATE TABLE [BinaryAssets].[BinaryAssets](
[BinaryAssetId] [int] IDENTITY(1,1) NOT NULL, 
[BinaryAssetStructureId] [int] NOT NULL, 
[Name] [nvarchar](max) NOT NULL, 
[Created_By] [int] NOT NULL, 
[Created_On] [bigint] NOT NULL, 
[Modified_By] [int] NOT NULL, 
[Modified_On] [bigint] NOT NULL, 
[Active] [bit] NOT NULL, 
CONSTRAINT [PK_BinaryAsset] PRIMARY KEY NONCLUSTERED 
(
[BinaryAssetId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

現在,SQL我試圖執行的模樣:

ALTER TABLE BinaryAssets.BinaryAssets ADD 
[Version] INT NOT NULL CONSTRAINT DF_BinaryAssets_Version DEFAULT 1 

ALTER TABLE BinaryAssets.BinaryAssets 
DROP CONSTRAINT DF_BinaryAssets_Version 

當我試圖執行我得到的SQLException(見標題)。

現在,我不認爲我的表超過8060,所以這裏有什麼問題。奇怪的是,當我將nvarchar(max)的名稱從nvarchar(max)更改爲nvarchar(100)時,然後執行我的新sql,然後將100更改爲MAX,它確實有效......邏輯在這裏似乎很遙遠。

有人能告訴我我在做什麼錯嗎?

+0

你在[Name]中放入了什麼,需要nvarchar(max)?你不能只使用nvarchar(100)嗎? – gingerbreadboy 2010-01-25 13:43:36

+2

我明白了答案,告訴你8,000尺寸是記錄的最大值。但是,你是如何將它調整到max,稍後...這只是一個(非常瘋狂)的猜測:也許max表示「使用所有可用空間」,並且當你創建它時,sqlserver將保留目前爲止的可用空間(在考慮其餘領域之前)。所以,你可以嘗試使用最後一個位置的[Name]字段來創建表格,看看會發生什麼:)(僅僅爲了好玩) – helios 2010-01-25 13:50:35

+0

嗯,事實上,可能是這樣,但我仍然會覺得很奇怪。 – 2010-01-25 13:53:31

回答

2

您可以輸入nvarchar字段的最大尺寸爲MAX,這是4000個字符(2個字節的Unicode字符)。

In SQL Server 2000 and SQL Server 7, 行的大小不能超過8000字節。 這意味着VARBINARY列可以 僅存儲8000個字節(假設它是 在一個表中只列),一個VARCHAR 柱可以存儲多達8000個字符 和NVARCHAR柱可以存儲多達 4000個字符(2字節每個unicode 字符)。此限制源於 SQL Server 用於將數據保存到磁盤的8 KB內部頁面大小。

如果你需要存儲的文字較長的身體,你應該使用任何textntext,爲你的系統有硬盤空間,可容納儘可能多的文本。

您似乎正在嘗試創建一個大小爲的大於的行,而不是可能的大小,這不是有效的操作。

+8

當指定爲特定數字時,2005/2008 nvarchar的最大值爲4000,但使用nvarchar(max)關鍵字時,您有2^31-1個字節。 http://msdn.microsoft.com/en-us/library/ms186939.aspx – Andrew 2010-01-25 14:04:03

4

sp_tableoption存儲過程'large value types out of row'選項設置爲ON以將字段關閉頁面存儲。

+1

他應該使用一個文本字段,如果他正在處理這麼多的文字。 – voyager 2010-01-25 13:51:10

+8

海報爲什麼要使用TEXT數據類型?它們將被棄用,並已用nvarchar(max),varchar(max)和varbinary(max)進行replcaced。請參閱SQL Server聯機叢書:http://msdn.microsoft.com/en-us/library/ms187993.aspx – 2010-01-25 14:26:05

+0

John Sansom是正確的http://msdn.microsoft.com/en-us/library/ms178158.aspx – gingerbreadboy 2010-01-25 15:04:02

1

在SQL Server 2005/2008,頁面大小是一樣的(8K),但數據庫使用指針的行中的頁面指向包含較大的領域的其他頁面。這使得2005年可以克服8K行大小限制。

相關問題