积极答复者
微软的技术贪乏了吗?

问题
-
SQL Server 2005是微软五年磨一剑的产品,推出之后赞誉声一片。确实,相比sql server 2000,2005有了长足的进步,算是从娃娃长大成人了,可是,一些儿时的坏习惯,依然如故啊。
在SQL Server 2000中,数据行不能跨越页边界(参考: http://ningoo.itpub.net/post/2149/205525 ),所以限制了一行数据最大只能8060字节,到了2005,微软对于字符类型做了改进,号称原来8k的varchar,通过新的varchar(max)可以支持到2G大小,从此可以使用varchar(max)来替代text了,好消息。
可是,数据行的限制呢?依然存在,不知道这个历史遗留问题,是修改的难度太大,还是微软故意忽视了?
create table big(a char(4000),b char(4000),c char(4000))
Msg 1701, Level 16, State 1, Line 3
Creating or altering table 'big' failed because the minimum row size would be 12007, including 7 bytes of internal overhead. This exceeds the maximum allowable table row size of 8060 bytes.显然,微软对于varchar(max)类型做了另外的处理,应该是象Oracle的行外LOB一样,在数据行中存了一个指针指向varchar(max)实际存储位置。既然已经能实现行数据链接,为什么还要将行限制在一个页内?
答案
-
create table big(a char(4000),b char(4000),c varchar(4000))
好像唯一的解决办法就是把其中一个改成varchar,让他移动到 ROW_OVERFLOW_DATA 分配单元的另一页上。
确实好像不能像楼主说的突破一页。SQL2008也是如此。- 已标记为答案 KeFang Chen 2009年10月2日 4:11
-
改为Varchar
Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com- 已标记为答案 KeFang Chen 2009年10月2日 4:11
-
- 已标记为答案 KeFang Chen 2009年10月2日 4:11
全部回复
-
create table big(a char(4000),b char(4000),c varchar(4000))
好像唯一的解决办法就是把其中一个改成varchar,让他移动到 ROW_OVERFLOW_DATA 分配单元的另一页上。
确实好像不能像楼主说的突破一页。SQL2008也是如此。- 已标记为答案 KeFang Chen 2009年10月2日 4:11
-
改为Varchar
Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com- 已标记为答案 KeFang Chen 2009年10月2日 4:11
-
- 已标记为答案 KeFang Chen 2009年10月2日 4:11
-
另外,每列的长度还是受到8000的限制的:
1.创建表失败
create table TestBigTable (char1 varchar(8001) not null) --消息 131,级别 15,状态 2,第 1 行 --赋予 列 'char1' 的大小(8001)超出了任意数据类型的最大允许值(8000)。
2.创建表插入数据都成功,但截断成8000了
create table TestBigTable (char1 varchar(max) not null) --(1 行受影响) insert TestBigTable (char1) select replicate('a',8004) --(1 行受影响) select LEN(char1) as len from TestBigTable /*len -------------------- 8000 (1 行受影响) */