0

在我们的数据库中,有一个包含XML数据类型列的表。该栏是强制性的 ( not null),我需要将其设为非强制性 ( null)。我写了一个类似的脚本:

alter table [SomeSchema].[SomeTable] alter column [SomeColumn] XML null

我需要编写/测试一个回滚脚本,所以我写了一个类似于:

alter table [SomeSchema].[SomeTable] alter column [SomeColumn] XML not null

初始语句正确执行。当我尝试测试/执行回滚时,出现以下错误:

消息 511,级别 16,状态 1,行 1
无法创建大小为 8082 的行,该行大于允许的最大行大小 8060。语句已终止。

这个问题似乎与row overflow相关,据说它不应该适用于 XML 类型(但似乎在这种情况下)。此问题仅在某些记录在表中时才会出现(即受数据影响),但它似乎与数据的大小没有直接关系。例如,一条记录的 XML 长度为 10,473 个字符并触发了此问题;另一条记录的 XML 长度为 159,072 个字符,并未触发该问题。

设置:

  • 视窗 XP SP3
  • SQL Server 2008 R2
4

1 回答 1

0

我们的常驻数据库专家设法找到了一些代码来解决这个问题(见下文),但仍然无法解释为什么会发生这种情况/这是必要的。我们怀疑小于 8060 字节的 XML 将存储在行中,而较大的 XML 将存储在 LOB 存储中,并且以某种方式应用 [非] 强制约束会导致行大小增加到超出此限制,但是 SQL Server 并没有优雅地处理这个问题。我们仍然不知所措:

  • 实际发生了什么
  • 为什么我们会收到此错误(SQL Server 错误?我们的做法不好?)
  • 为什么对于一些已经大于 8k 的记录会发生这种情况

欢迎任何解释!

exec sp_tableoption '[SomeSchema].[SomeTable]', '行外的大值类型', 1;
去

更改表 [SomeSchema].[SomeTable] 删除约束 [ThePKConstraint]
去

alter table [SomeSchema].[SomeTable] 添加约束 [ThePKConstraint] 主键聚集
(
      [SomeIDColumn] asc,
      [SomeOtherIDColumn] asc
)
去
于 2012-10-03T06:25:05.810 回答