Sql server 2008 r2 超出SQL 2008 R2行大小限制

Sql server 2008 r2 超出SQL 2008 R2行大小限制,sql-server-2008-r2,Sql Server 2008 R2,我有sql 2008 R2数据库。我创建了一个表,当尝试对其执行select语句(带有ORDERBY子句)时,收到错误“无法创建大小为8870的行,该行大于允许的最大行大小8060” 我可以在没有ORDERBY子句的情况下选择数据,但是ORDERBY子句很重要,我需要它。我尝试了一个健壮的计划选项,但仍然收到了相同的错误 我的表有300多个数据类型为文本的列。我尝试过使用varchar和nvarchar,但没有成功 有人能提供一些见解吗 更新: 谢谢你的评论。我同意。一个表中有300多列不是很好

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

我可以在没有ORDERBY子句的情况下选择数据,但是ORDERBY子句很重要,我需要它。我尝试了一个健壮的计划选项,但仍然收到了相同的错误


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

有人能提供一些见解吗

更新

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

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

表的结构通常遵循以下模式: fkVersionID、行号(自动编号)、字段1、字段2、字段3等


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

我相信您正在遇到限制:

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


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

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


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

你提到你试过nvarchar和varchar。。。请记住,nvarchar将使用的字节数增加了一倍,但在某些情况下,它是这两种语言中唯一支持外来字符的,例如重音符号

如果可以适当限制其最大大小,那么varchar是一个不错的选择。 8000个字符仍然是一个真正的限制,但如果平均每个varchar列不超过26个字符,就可以了。 您可以更冒险地使用varchar和50char长度,但平均每列只使用26个字符。。这意味着一列的长度可能是36个字符,下一列的长度是16个字符。。。那你又没事了。(只要不超过300列中每列26个字符的平均值。)

显然,由于字段的数量是动态的,并且可能超过8000个字符的限制,SQL规范注定了这一点。 您唯一的另一种选择是创建多个表,当您访问数据时,使用一个唯一的键来连接相应的记录。因此,在select语句中,使用join,然后从多个表中处理8000+8000+的行


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

300多个文本类型的列?真正地听起来数据库可能需要一些规范化。你能展示一下你的表布局吗?“300多个数据类型为文本的列。”这是一个非常糟糕的设计。文本并不意味着文本。任何列数超过大约100+的表都可能被拆分。可能没有办法绕过8060表的限制,但可能有另一种方法来完成您试图对数据执行的操作。那么,您想用data=)做什么呢?想想看,如果您不需要对所有300列进行排序,您可以先对您计划筛选/排序的列执行
选择
,然后将结果连接回原始表,并实际选择您需要的所有列。可能表现不好,但可以工作。@Mitch Wheat:这种说法并不完全正确。至少有关的文档说明:“SQL Server支持行溢出存储,这使得可变长度的列可以从行中推出。对于从行中推出的可变长度列,主记录中只存储24字节的根;因此,有效行限制高于SQL Server早期版本中的行限制。有关详细信息,请参阅SQL Server联机丛书中的“超过8 KB的行溢出数据”主题。“我们正在尝试将excel中的选项卡作为表引入数据库。有些选项卡具有300多个列。我同意R0MANARMY的说法,即中间表的行大小导致了我的问题,但是否有办法解决这个问题?”?