无法创建大小大于 8060 的行(此错误消息是一个奇怪的情况)

问题描述 投票:0回答:2

我收到错误“无法创建大小为 8766 的行,该行大小大于允许的最大行大小 8060。”

这种情况发生在有很多列(大约 300 个)的查询中,大多数类型为“int”或“float”。此查询计算包含 31 列(每天一列)的 HRM 报告。在此发布此查询可能会占用太多空间,但如果您坚持的话,我可以。我确信 300 列 float(4 甚至 8 字节)和一些 varchar 永远不应该超过 8060 字节。尽管如此,错误还是发生了。问题是,它以一种奇怪的方式发生。

在此查询的第一级中,它看起来像这样:

select  
Title,
K0Present, K1Present, K2Present,
HT,K0_T,
case when bla bla then bla bla when bla bla then bla bla end as Y01,
case when bla bla then bla bla when bla bla then bla bla end as Y02
...
case when bla bla then bla bla when bla bla then bla bla end as Y31
from
(_inner_query_)
order by Title

现在,内部查询大约有 300 列。在外部查询中,我们有 37 列。它会导致错误消息。

但是,如果我将其更改为:

select  
*,
case when bla bla then bla bla when bla bla then bla bla end as Y01,
case when bla bla then bla bla when bla bla then bla bla end as Y02
...
case when bla bla then bla bla when bla bla then bla bla end as Y31
from
(_inner_query_)
order by Title

错误信息消失了!即使现在输出窗口中还有大约 300 个以上的内容!

我该如何解决这个问题?我没有任何线索。也许查询优化器有什么奇怪的地方?也许它以某种方式错误地优化了我的查询?

sql sql-server-2008 t-sql
2个回答
1
投票

如果您的物理数据大小小于

8060
但仍然收到此错误,请尝试以下命令。

DBCC CLEANTABLE for example, DBCC CLEANTABLE (Databasename,'tablename', 0) WITH NO_INFOMSGS;

-1
投票

您可以调查哪一列有问题。.尝试逐列选择

select  
Title,
*
case when bla bla then bla bla when bla bla then bla bla end as Y01,
case when bla bla then bla bla when bla bla then bla bla end as Y02
...
case when bla bla then bla bla when bla bla then bla bla end as Y31
from
(_inner_query_)
order by Title

然后

select 
K0Present,
*
case when bla bla then bla bla when bla bla then bla bla end as Y01,
case when bla bla then bla bla when bla bla then bla bla end as Y02
...
case when bla bla then bla bla when bla bla then bla bla end as Y31
from
(_inner_query_)
order by Title

等等..

也许是一个问题,使用 ORDER BY..尝试执行不带它的查询。这可以帮助您https://msdn.microsoft.com/en-us/library/ms143432(v=sql.120).aspx

© www.soinside.com 2019 - 2024. All rights reserved.