无法创建大小为8064的行,该行大于允许的行大小8060

时间:2010-01-25 13:36:51

标签: sql-server sql-server-2008

将列添加到现有表时,我遇到了这个奇怪的问题。

现有表格如下:

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(100)时,然后执行我的新sql,然后将100更改为MAX,它确实有效...逻辑似乎在这里很远。

有谁能告诉我这里我做错了什么?

3 个答案:

答案 0 :(得分:4)

sp_tableoption存储过程'large value types out of row'选项设置为ON以将该字段存储在页面之外。

答案 1 :(得分:2)

nvarchar字段的最大大小为MAX,为4000个字符(2字节Unicode字符)。

  

In SQL Server 2000 and SQL Server 7,a   行的大小不能超过8000个字节。   这意味着VARBINARY列可以   只存储8000个字节(假设它是   一个表中唯一的一列,VARCHAR   列最多可以存储8000个字符   并且NVARCHAR列最多可以存储   4000个字符(每个unicode 2个字节   字符)。这种限制源于   8 KB内部页面大小SQL Server   用于将数据保存到磁盘。

如果您需要存储较长的文本,则应使用textntext,这样可以容纳与系统硬盘空间一样多的文本。

您似乎尝试创建一个大小大于的行,而不是可能的大小,这不是有效的操作。

答案 2 :(得分:1)

在SQL Server 2005/2008中,页面大小相同(8K),但数据库使用页面中行上的指针指向包含更大字段的其他页面。这允许2005年克服8K行大小限制。