更改XML列的强制约束时出错

时间:2012-10-03 06:25:06

标签: xml sql-server-2008-r2

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

的脚本
alter table [SomeSchema].[SomeTable] alter column [SomeColumn] XML null

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

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

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

  

Msg 511,Level 16,State 1,Line 1
  无法创建8082行   这大于允许的最大行大小8060   声明已被终止。

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

设定:

  • Windows XP SP3
  • SQL Server 2008 R2

1 个答案:

答案 0 :(得分:0)

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

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

欢迎任何解释!

exec sp_tableoption '[SomeSchema].[SomeTable]', 'large value types out of row', 1;
go

alter table [SomeSchema].[SomeTable] drop constraint [ThePKConstraint]
go

alter table [SomeSchema].[SomeTable] add constraint [ThePKConstraint] primary key clustered
(
      [SomeIDColumn] asc,
      [SomeOtherIDColumn] asc
)
go