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