Sql server 2008 更改具有多页行的列的排序规则

Sql server 2008 更改具有多页行的列的排序规则,sql-server-2008,Sql Server 2008,我们正在更改数据库的排序规则 我们遇到了一个问题,当我试图用数据类型varcharmax更改其中一列时,我得到了以下错误: Cannot create a row of size 8083 which is greater than the allowable maximum row size of 8060. 如果我检查最大的柱子的大小 select top 1 LEN(Document) as l1,* from GroupDocument where LEN(document) >

我们正在更改数据库的排序规则

我们遇到了一个问题,当我试图用数据类型varcharmax更改其中一列时,我得到了以下错误:

Cannot create a row of size 8083 which is greater than the allowable maximum row size of 8060.
如果我检查最大的柱子的大小

select top 1 LEN(Document) as l1,* from GroupDocument where LEN(document) > 8000 order by LEN(document) desc
我的尺寸是39431,大约10页

我假设这就是为什么我不能更改排序规则的问题。我之前在其他专栏中没有遇到过这个问题。任何帮助都将不胜感激

我想一种解决方案是将表中的所有内容复制到另一个表中,更改排序规则,然后再次将其移回。但如果可能的话,我宁愿不那样做

编辑:

尝试了以下操作:

创建表诱惑id int,文档nvarcharmax

插入诱惑id,文档选择GroupDocumentID,文档来自GroupDocument

altertablegroupdocument下拉列文档 alter table TENTABLE alter column document nvarcharmax 更改表格[GroupDocument]添加[Document]ntext将芬兰语和瑞典语对比为NULL

更新GroupDocument set Document=从诱惑中选择诱惑.Document,其中诱惑.id=GroupDocument.GroupDocumentID

还是一样的问题


导致问题的行有一个7996字节的varchar,加上一些int,我猜这是一个边界情况。

我做了一个组合,强制将较大的值移出行

EXEC sp_table选项“dbo.GroupDocument”, “行外的大值类型”,1

打扫桌子

dbcc cleantable'ExamDoc','groupdocument',0

最后删除并重建表的索引


解决了问题!:D

你没有真正理解这个问题。行大小不是一列上字符串的长度,而且,作为记录,使用VARCHARMAX时它可能会更长,它是整行字节的实际大小,包括表中的每一列是的,我知道这一点。事情是这样的。如果总大小<8060,则varcharmax似乎位于同一行中,但对于特殊情况,总大小刚好小于8060,因此当我尝试更改排序规则时,会添加一个额外的列。然后它就溢出来了我无法使用该信息构建临时表,请删除该列,然后复制它。不幸的是,同样的问题。在这种情况下,表具有这种布局;int,int,nvarcharmax,datetime,bit,int,int。我看不出行大小超过8060字节的原因,除非它试图将数据存储在列中而不是行外。Jonas还尝试使用sp_table选项“Document”、“行外大值类型”1强制对大值类型使用行外存储。