【问题标题】:Cannot create a row of size 8064 which is greater than the allowable row size of 8060无法创建大于允许行大小 8060 的大小为 8064 的行
【发布时间】:2010-02-14 18:56:36
【问题描述】:

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

现有表格如下:

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 时,它确实起作用了……逻辑在这里似乎很遥远。

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

【问题讨论】:

  • 您在需要 nvarchar(max) 的 [Name] 中添加了什么?你不能只使用 nvarchar(100) 吗?
  • 我知道答案告诉你 8,000 大小是记录的最大值。但是你怎么能把它调整到最大值,稍后......这只是一个(非常疯狂的)猜测:也许 max 表示“使用所有可用空间”,当你创建它时,sqlserver 正在保留可用空间到目前为止(在考虑其他领域之前)。因此,您可以尝试在最后一个位置创建带有 [Name] 字段的表,看看会发生什么:)(只是为了好玩)
  • 嗯,确实可能是这样,但我还是觉得很奇怪。
  • 您能否编辑帖子/标签以指示 SQL 7/2000/2005/2008,因为如果 SQL 2000/7 是 2005/2008,则给出的答案将完全不正确
  • 我尝试过复制它无济于事 - 即使我专门准备页面并在更改命令之前检查(使用 dbcc ind / dbcc 页面检查我是否处于限制状态)我不能让它抛出错误。您是否还有其他遗漏或应用了一些简化?

标签: sql-server sql-server-2008


【解决方案1】:

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

【讨论】:

  • 如果他正在处理这么多的文本,他应该使用文本字段。
  • 为什么张贴者应该使用 TEXT 数据类型?它们将被弃用,并已被 nvarchar(max)、varchar(max) 和 varbinary(max) 取代。请参阅 SQL Server 联机丛书:msdn.microsoft.com/en-us/library/ms187993.aspx
【解决方案2】:

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

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

如果您需要存储更长的文本正文,您应该使用textntext,它们可以容纳与系统硬盘空间一样多的文本。

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

【讨论】:

【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多