2011-04-11 99 views
2

我有SQL 2008 R2数据库。我创建了一个表,当试图执行select语句(使用order by子句)时,我收到错误“无法创建大于最大允许行大小8060的行8870”。SQL 2008 R2超出行大小限制

我可以选择数据而无需order by子句,但order by子句很重要,我需要它。我已经尝试了一个强大的计划选项,但我仍然收到相同的错误。

我的表格有300多列,数据类型为TEXT。我曾尝试使用varchar和nvarchar,但没有成功。

有人可以提供一些见解吗?

更新

感谢征求意见。我同意。一张桌子中的300多列不是很好的设计。我想要做的是将excel制表符作为数据表引入数据库。一些标签有300多列。

我首先使用CREATE语句来创建基于excel选项卡的表,以便各列不同。然后,在用数据创建表之后,我在表上执行各种SELECT,UPDATE,INSERT等语句。

表的结构通常遵循这一行话: fkVersionID,ROWNUMBER(自动编号),字段1,字段2,字段3,等等

有没有什么办法让周围的8060行大小限制?

+3

300多列TEXT类型的列?真?听起来像那个数据库可以使用一些规范化。 – 2011-04-11 22:58:09

+0

你可以显示你的表格布局吗? – 2011-04-11 23:12:52

+0

“数据类型为TEXT的300多列”。只是一个非常糟糕的设计。 TEXT不代表文字。任何桌子超过约。 100多列是可能的分裂候选者。 – 2011-04-12 00:29:09

回答

0

我相信你正在运行到this限制:

没有限制在ORDER BY子句中的项目数。但是,对于排序操作所需的中间工作表的行大小有8,060个字节的限制。这限制了ORDER BY子句中指定的列的总大小。

+0

@米奇小麦:这种说法并不完全正确。至少[SQL Server 2008]的文档(http://msdn.microsoft.com/en-us/library/ms143432.aspx)说:“SQL Server支持行溢出存储,使可变长度的列可以被关闭-row。只有一个24字节的根存储在主行记录中,用于列中的可变长度列;因此,有效的行限制高于先前版本的SQL Server。有关更多信息,请参见“行SQL Server联机丛书“中的”溢出数据超过8 KB“主题。” – R0MANARMY 2011-04-12 19:59:01

+0

我们试图做的是将excel中的选项卡作为表格放入数据库中。有一些标签300列以上。我同意R0MANARMY,中间表的行大小正在引起我的问​​题,但是有无论如何绕过它? – Amy 2011-04-13 13:19:09

0

我有一个像这样的遗留应用程序,这是一场噩梦。

首先,我把它分成了多个表格,都是一对一的。这是不好的,但不如你得到的那么糟糕。

然后我改变了查询,只请求实际需要的列。 (我不知道你是否有这个选项。)

2

你提到你试过nvarchar和varchar ...记住nvarchar使用的字节数加倍,但它是两个中唯一支持外来字符的一些情况下,如重音标记。

如果您可以适当限制其最大尺寸,varchar是一个不错的选择。 8000个字符仍然是一个真正的限制,但如果平均每个varchar列不超过26个字符,那么您会没事的。 你可能会冒风险,并与varchar和50char长度,但平均只使用每列26个字符..意味着一列可能是36个字符长度,而下一个是16个字符长度......然后你又好了。 (只要你从未超过300列的每列26个字符的平均值)。

显然,对于动态数量的字段以及超过8000个字符限制的可能性,SQL规范注定要失败。 你唯一的选择是创建多个表,当你访问数据时,有一个唯一的键来加入适当的记录。因此,在你的select语句中,使用连接,并从多个表中,然后你可以处理8000 + 8000 +行...

所以这是可行的,但你必须使用SQL规则。