SQL 2008 R2超出行大小限制

时间:2011-04-11 22:57:16

标签: sql-server-2008-r2

我有sql 2008 R2数据库。我创建了一个表,当我尝试对它执行一个select语句(带有order by子句)时,我收到错误“无法创建大小为8870的行,该行大于允许的最大行大小8060。”

我能够在没有order by子句的情况下选择数据,但order by子句很重要,我需要它。我尝试了一个强大的计划选项,但我仍然收到同样的错误。

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

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

更新

感谢您的评论。我同意。一张表中300多列不是很好的设计。我要做的是将excel选项卡作为数据表引入数据库。有些标签有300多列。

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

表格的结构通常遵循以下模式: fkVersionID,RowNumber(autonumber),Field1,Field2,Field3等......

有没有办法绕过8060行大小限制?

3 个答案:

答案 0 :(得分:2)

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

如果您可以适当地限制其最大大小,

varchar是一个不错的选择。 8000个字符仍然是一个真正的限制,但如果平均每个varchar列不超过26个字符,你会没事的。 你可以冒险并使用varchar和50char长度,但平均每列仅使用26个字符..意味着一列可能是36个字符长度,接下来是16个字符长度......那么你再次没问题。 (只要你永远不会超过300列每列26个字符的平均值。)

显然,对于动态的字段数,并且可能超过8000个字符的限制,它注定了SQL的规格。 您唯一的另一种选择是创建多个表,并在访问数据时,使用唯一键来加入适当的记录。因此,在您的select语句中,使用连接,然后从多个表中,您可以处理8000 + 8000 + ...

的行

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

答案 1 :(得分:1)

我相信你遇到了this限制:

  

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

答案 2 :(得分:0)

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

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

然后我更改了查询以仅请求实际需要的列。 (我不知道你是否有这个选择。)