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

时间:2010-01-26 12:41:03

标签: sql-server sql-server-2008

我已经问了一个关于这个的问题,但是问题一直在打击我; - )

我有两张相同的桌子。我想添加一个xml列。在第一个表中这没有问题,但在第二个表中我得到sqlException(标题)。但是,除了它中的数据,它们是相同的。那么,我可以因为表中的数据而得到sqlException吗?

我还试图将页面存储在

页面之外
EXEC sp_tableoption 'dbo.PackageSessionNodesFinished', 
  'large value types out of row', 1

但没有任何成功。相同的SqlException不断出现。

第一个表:PackageSessionNodes

CREATE TABLE [dbo].[PackageSessionNodes](
    [PackageSessionNodeId] [int] IDENTITY(1,1) NOT NULL,
    [PackageSessionId] [int] NOT NULL,
    [TreeNodeId] [int] NOT NULL,
    [Duration] [int] NULL,
    [Score] [float] NOT NULL,
    [ScoreMax] [float] NOT NULL,
    [Interactions] [xml] NOT NULL,
    [BrainTeaser] [bit] NULL,
    [DateCreated] [datetime] NULL,
    [CompletionStatus] [int] NOT NULL,
    [ReducedScore] [float] NOT NULL,
    [ReducedScoreMax] [float] NOT NULL,
    [ContentInteractions] [xml] NOT NULL,
 CONSTRAINT [PK_PackageSessionNodes] PRIMARY KEY CLUSTERED 
(
    [PackageSessionNodeId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

第二个表:PackageSessionNodesFinished

CREATE TABLE [dbo].[PackageSessionNodesFinished](
    [PackageSessionNodeFinishedId] [int] IDENTITY(1,1) NOT NULL,
    [PackageSessionId] [int] NOT NULL,
    [TreeNodeId] [int] NOT NULL,
    [Duration] [int] NULL,
    [Score] [float] NOT NULL,
    [ScoreMax] [float] NOT NULL,
    [Interactions] [xml] NOT NULL,
    [BrainTeaser] [bit] NULL,
    [DateCreated] [datetime] NULL,
    [CompletionStatus] [int] NOT NULL,
    [ReducedScore] [float] NOT NULL,
    [ReducedScoreMax] [float] NOT NULL,
    [ContentInteractions] [xml] NULL,
 CONSTRAINT [PK_PackageSessionNodesFinished] PRIMARY KEY CLUSTERED 
(
    [PackageSessionNodeFinishedId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

我尝试运行的第一个脚本(前两个ALTER TABLE工作正常,第三个在SqlException上崩溃)

ALTER TABLE dbo.PackageSessionNodes ADD
    ContentInteractions xml NOT NULL CONSTRAINT 
    DF_PackageSessionNodes_ContentInteractions 
    DEFAULT (('<contentinteractions/>'));

ALTER TABLE dbo.PackageSessionNodes
    DROP CONSTRAINT DF_PackageSessionNodes_ContentInteractions

ALTER TABLE dbo.PackageSessionNodesFinished ADD
    ContentInteractions xml NOT NULL CONSTRAINT 
    DF_PackageSessionNodesFinished_ContentInteractions 
    DEFAULT (('<contentinteractions/>'));

ALTER TABLE dbo.PackageSessionNodesFinished
    DROP CONSTRAINT DF_PackageSessionNodesFinished_ContentInteractions

第二个脚本我尝试使用与前一个脚本相同的结果运行:

EXEC sp_tableoption 'dbo.PackageSessionNodes', 
    'large value types out of row', 1

ALTER TABLE dbo.PackageSessionNodes ADD
    ContentInteractions xml NOT NULL CONSTRAINT
    DF_PackageSessionNodes_ContentInteractions 
    DEFAULT (('<contentinteractions/>'));

ALTER TABLE dbo.PackageSessionNodes
    DROP CONSTRAINT DF_PackageSessionNodes_ContentInteractions

EXEC sp_tableoption 'dbo.PackageSessionNodesFinished', 
    'large value types out of row', 1

ALTER TABLE dbo.PackageSessionNodesFinished ADD
    ContentInteractions xml NOT NULL CONSTRAINT 
    DF_PackageSessionNodesFinished_ContentInteractions 
    DEFAULT (('<contentinteractions/>'));

ALTER TABLE dbo.PackageSessionNodesFinished
    DROP CONSTRAINT DF_PackageSessionNodesFinished_ContentInteractions

现在,在PackageSessionNodes中有234条记录,在PackageSessionNodesFinished中有4256946条记录。

在我被困住的时候,真的很感激一些帮助。

4 个答案:

答案 0 :(得分:3)

归结为数据。如果您要将此列添加到空表或实际上添加到第一个表中,您将收到一条警告:可能导致最大行大小超出限制,并且这可能导致插入或更新失败。在第二个表的情况下,至少有一行已经处于这种情况的状态,因此添加失败的列。警告是有原因的,应该很少被忽略。

所以,是的,你可以因为表中的数据而得到这个。

答案 1 :(得分:3)

首先尝试清空表格,进行更改,然后重新输入数据。听起来有一行将其现有数据存储在行中,并且添加新列刚刚超出其限制。如果您取出数据,进行更改,然后再将其重新放回,则应该将xml存储在行外。

不幸的是,如果你改变这种类型,它不会将数据移出一行。这是一个非常罕见的情况,你不走运。

编辑:此外,您可以在设置表选项后尝试重建聚簇索引,以便所有XML都将被强制排除。您还可以进行一些数学计算和一些计算行长度,以确定导致问题的行。然后你可以暂时移动那些数据。

答案 2 :(得分:3)

仅供参考,在数据库上运行此SQL命令可以解决问题,如果它是由丢弃可变长度列后需要回收的空间引起的:

DBCC CLEANTABLE (0,[dbo.TableName])

请参阅:http://msdn.microsoft.com/en-us/library/ms174418.aspx

答案 3 :(得分:3)

除了运行DBCC CLEANTABLE之外,我还必须使用以下命令重建表。

DBCC CLEANTABLE (TheNameOfYourDB, 'TableName', 0);
ALTER TABLE TableName REBUILD;