我已经问了一个关于这个的问题,但是问题一直在打击我; - )
我有两张相同的桌子。我想添加一个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条记录。
在我被困住的时候,真的很感激一些帮助。
答案 0 :(得分:3)
归结为数据。如果您要将此列添加到空表或实际上添加到第一个表中,您将收到一条警告:可能导致最大行大小超出限制,并且这可能导致插入或更新失败。在第二个表的情况下,至少有一行已经处于这种情况的状态,因此添加失败的列。警告是有原因的,应该很少被忽略。
所以,是的,你可以因为表中的数据而得到这个。
答案 1 :(得分:3)
首先尝试清空表格,进行更改,然后重新输入数据。听起来有一行将其现有数据存储在行中,并且添加新列刚刚超出其限制。如果您取出数据,进行更改,然后再将其重新放回,则应该将xml存储在行外。
不幸的是,如果你改变这种类型,它不会将数据移出一行。这是一个非常罕见的情况,你不走运。
编辑:此外,您可以在设置表选项后尝试重建聚簇索引,以便所有XML都将被强制排除。您还可以进行一些数学计算和一些计算行长度,以确定导致问题的行。然后你可以暂时移动那些数据。
答案 2 :(得分:3)
仅供参考,在数据库上运行此SQL命令可以解决问题,如果它是由丢弃可变长度列后需要回收的空间引起的:
DBCC CLEANTABLE (0,[dbo.TableName])
答案 3 :(得分:3)
除了运行DBCC CLEANTABLE
之外,我还必须使用以下命令重建表。
DBCC CLEANTABLE (TheNameOfYourDB, 'TableName', 0);
ALTER TABLE TableName REBUILD;